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

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

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

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

Q&A

解決済

1回答

1725閲覧

ドラッグアンドドロップした画像データのパスを表示したい

scarlet09Libra

総合スコア1

Python 3.x

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

0グッド

1クリップ

投稿2022/01/04 10:04

疑問・実現したいこと

サブウインドウから画像をドラッグアンドドロップし、メインウインドウのテキストボックスに画像のパスを表示させるGUIアプリを開発しています。

画像データがドロップされた時、SubWindowクラスのdropEventから、MainWindowクラスのputTextを実行し、メインウインドウのテキストボックスにテキストを表示させるようにしています。
しかし、putTextメソッドの「self.url.setPlainText('This function is work')」の部分が機能しておらず、テキストボックスに文字列が表示されません。(「print('WORKED!!')」は出力されるので、putTextが正常に機能していることは確認しています)

putTextの引数にfilepathを設定し、それをsetPlainTextで表示すれば想定する動作を実現できると考えていましたが、setPlainText自体が動かず困っています。
画像データがドロップされた時、そのパスをメインウインドウのテキストボックスに表示させるにはどうしたら良いでしょうか。また、なぜsetPlainTextは動かないのでしょうか。

ご教授の程よろしくお願い致します。

該当のソースコード

import sys from PyQt5.QtWidgets import QApplication, QPlainTextEdit, QWidget, QLabel, QVBoxLayout from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap class ImageLabel(QLabel): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setAlignment(Qt.AlignCenter) self.setText('\n\n Drop Image Here \n\n') self.setStyleSheet(''' QLabel{ border: 4px dashed #aaa } ''') def setPixmap(self, image): super().setPixmap(image) class SubWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('SubWindow') self.setGeometry(950, 200, 400, 400) self.setAcceptDrops(True) self.photoViewer = ImageLabel() imageLayout = QVBoxLayout() imageLayout.addWidget(self.photoViewer) self.setLayout(imageLayout) def dragEnterEvent(self, event): if event.mimeData().hasImage: event.accept() else: event.ignore() def dragMoveEvent(self, event): if event.mimeData().hasImage: event.accept() else: event.ignore() def dropEvent(self, event): if event.mimeData().hasImage: event.setDropAction(Qt.CopyAction) self.filepath = event.mimeData().urls()[0].toLocalFile() self.setImage(self.filepath) main = MainWindow() main.putText() event.accept() else: event.ignore() def setImage(self, filepath): self.photoViewer.setPixmap(QPixmap(filepath)) class MainWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('MainWindow') self.setGeometry(200, 100, 500, 200) self.url = QPlainTextEdit(self) self.url.setGeometry(50, 50, 400, 100) self.url.setPlaceholderText('Image URL will be set here') def putText(self): self.url.setPlainText('This function is work') print('WORKED!!') if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sub_window = SubWindow() sub_window.show() sys.exit(app.exec_())

開発環境

OS: macOS Catalina 10.15.7
Python: 3.8.2
PyQt5: 5.15.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

PyQt5は使ったことがありませんし、検証もしていないのですが、

python

1 def dropEvent(self, event): 2 if event.mimeData().hasImage: 3 event.setDropAction(Qt.CopyAction) 4 self.filepath = event.mimeData().urls()[0].toLocalFile() 5 self.setImage(self.filepath) 6 7 main = MainWindow() 8 main.putText() 9 event.accept() 10 else: 11 event.ignore()

でイベントハンドラが呼ばれるたびにMainWindowクラスのインスタンスを生成し、しかもそのインスタンスをshowしていないのは間違いだろうと思います。

python

1 def dropEvent(self, event): 2 if event.mimeData().hasImage: 3 event.setDropAction(Qt.CopyAction) 4 self.filepath = event.mimeData().urls()[0].toLocalFile() 5 self.setImage(self.filepath) 6 7# main = MainWindow() 8 main_window .putText() 9 event.accept() 10 else: 11 event.ignore()

としてみると、もう少しわかってくると思います。

投稿2022/01/04 11:44

ppaul

総合スコア24666

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

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

scarlet09Libra

2022/01/06 14:22

おっしゃる通りインスタンスの生成は不要ですね。また、それをshowしていなかったのは致命的で、今回ハマった主な原因だったと思います。 おかげさまで無事解決できました。大変良い指摘、感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問