質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4775閲覧

PyQtでの画像表示系についての質問

t.m_tech

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/21 11:39

PyQt5を使って画像の表示をさせたのですが、マウスクリックで画像のピクセル座標を表示できるようにしたいです

該当のソースコード

Python

1import sys 2import os 3from PyQt5.QtWidgets import * 4from PyQt5.QtGui import * 5from PyQt5.QtCore import * 6 7text_dir = os.getcwd() 8 9class Example(QDialog): 10 11 def __init__(self): 12 super().__init__() 13 self.initUI() 14 15 def initUI(self): 16 self.setWindowTitle("hoge") 17 self.resize(600, 600) 18 self.link = "" 19 self.view = QGraphicsView() 20 self.view.setMouseTracking(True) 21 self.scene = QGraphicsScene(self.view) 22 self.srect = self.view.rect() 23 self.btn = QPushButton("パスを選択...", self) 24 self.btn.clicked.connect(self.ShowDialog) 25 self.view.installEventFilter(self) 26 27 layout = QGridLayout() 28 layout.setSpacing(10) 29 layout.addWidget(self.view,2,0,1,1) 30 layout.addWidget(self.btn,1,0) 31 32 self.setLayout(layout) 33 34 self.move(300, 200) 35 self.show() 36 37 def ShowDialog(self): 38 if self.link != "": 39 text = self.link 40 else: 41 text = text_dir 42 fname = QFileDialog.getOpenFileName(self, 'Open file', text,"画像ファイル(*.jpg)") 43 self.link = fname[0] 44 pic_item = QGraphicsPixmapItem(QPixmap(fname[0])) 45 self.scene.addItem(pic_item) 46 self.view.setScene(self.scene) 47 48 def eventFilter(self, source, event): 49 if event.type() == QEvent.MouseButtonPress and source is self.view: 50 if event.button() == Qt.LeftButton: 51 pos = event.pos() 52 QMessageBox.warning(self, "Message", str(pos.x())+"," + str(pos.y()), QMessageBox.Ok, QMessageBox.Ok) 53 return QWidget.eventFilter(self,source,event) 54 55 56 57 58if __name__ == '__main__': 59 60 app = QApplication(sys.argv) 61 ex = Example() 62 sys.exit(app.exec_())

試したこと

現在のコードでは、マウスの絶対位置は表示できるのですが、スクロールバーが発生した時にスクロール後のピクセル座標が表示できません

補足情報(FW/ツールのバージョンなど)

PyQt5

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

GraphicsViewで表示する画像が一つだけでしたら、mapToSceneを使うことで画像の座標が取得できます

また、今のeventFilter内の条件ですと、600x600以下の画像をViewに表示し画像以外の箇所をクリックした際にもダイアログが表示されてしまうかと思います。

下記で画像の座標が取得できました

python

1 def eventFilter(self, source, event): 2 if event.type() == QEvent.MouseButtonPress and source is self.view and self.view.itemAt(event.pos()): 3 if event.button() == Qt.LeftButton: 4 pos = self.view.mapToScene(event.pos()) 5 QMessageBox.warning(self, "Message", str(pos.x())+"," + str(pos.y()), QMessageBox.Ok, QMessageBox.Ok) 6 return QWidget.eventFilter(self, source, event) 7

投稿2019/03/22 02:49

編集2019/03/22 02:53
hibiki24

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.m_tech

2019/03/22 03:13

回答して頂いたコードを試したのですが、"AttributeError: 'QEvent' object has no attribute 'pos'"と出てエラーが出ました。 if event.type() == QEvent.MouseButtonPress and source is self.view: if event.button() == Qt.LeftButton: pos = event.pos() if self.view.itemAt(pos): pos = self.view.mapToScene(pos) QMessageBox.warning(self, "Message", str(pos.x())+"," + str(pos.y()), QMessageBox.Ok, QMessageBox.Ok) このように書くとうまく動作するようなのですが、なぜif文内ではevent.pos()が受け取れて外では受け取れないのでしょうか・・・??
hibiki24

2019/03/22 04:28 編集

すみません 回答後ミスに気づき急いで編集したのですが間に合わなかったみたいですね???? eventFilterにはMousePressEvent以外にも色々なイベントが入ってくるのですが、それを最初のif 文で弾いているわけです if event.type() == QEvent.MouseButtonPress なので、MousePressEvent以外を弾く前にevent.pos()としたために、posメソッドを持っていないイベントに対してposメソッドを求めたためAttributeErrorになってしまいました
t.m_tech

2019/03/22 06:19

なるほど 詳しい解説ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問