2017-06-20 3 views
2

私はユーザーが手動でファイルを選択するか、ファイルをMainWindowにドラッグアンドドロップすることができるプログラムを作ろうとしています。Pyside/PyQt:クラス間で情報を送信する方法

ファイルブラウザが動作し、メインウィンドウには、ドロップを受け入れますが、私は方法を見つけ出すことはできません。

  1. Ui_MainWindow
  2. 変更pushButton選択したファイルのテキストに「クラスmyMainWindowから出て、クラスにfilePathをゲット'ファイルが削除されたとき。

私はemit()/ signal()を使用して2つのクラス間で情報を送信する必要があるようですが、それらを接続する方法を理解できません。

全コード:

from PySide import QtCore, QtGui 


class myMainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent=parent) 
     self.filePath = '' 

    def dragEnterEvent(self, event): 
     if event.mimeData().hasUrls: 
      event.accept() 
     else: 
      event.ignore() 

    def dragMoveEvent(self, event): 
     if event.mimeData().hasUrls: 
      event.setDropAction(QtCore.Qt.CopyAction) 
      event.accept() 
     else: 
      event.ignore() 

    def dropEvent(self, event): 
     if event.mimeData().hasUrls: 
      event.setDropAction(QtCore.Qt.CopyAction) 
      event.accept() 
      for url in event.mimeData().urls(): 
       self.filePath = (str(url.toLocalFile())) 
       # What else do I do here? 
     else: 
      event.ignore() 


class Ui_MainWindow(object): 
    def selectFile(self): 
     self.filePath = QtGui.QFileDialog.getOpenFileName() 
     self.pushButton.setText('File Selected') 
     print(self.filePath) 

    def myChanges(self): 
     self.pushButton.clicked.connect(self.selectFile) 

    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 600) 
     MainWindow.setAcceptDrops(True) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(330, 180, 75, 23)) 
     self.pushButton.setObjectName("pushButton") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

     self.myChanges() 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 
     self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Browse", None, QtGui.QApplication.UnicodeUTF8)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = myMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 
+1

最初の点をよりよく説明できます。 – eyllanesc

+1

このコードを実行すると、「参照」というラベルの付いた巨大なウィンドウがポップアップします。そのボタンを押すと、QFileDIalogウィンドウがポップアップし、ファイルを選択すると、ボタンのテキストが「選択されたファイル」に変わります。だから、起こってほしいことの少なくとも1つが起こります。 – mauve

+1

私は最初の点について質問します – eyllanesc

答えて

2

「クラス間で情報を送信する」(またはそれらが通信してい)するための唯一の方法で任意のオブジェクト指向言語では、メッセージ(例えば、Pythonのメソッド)を介してです。 Pysideの/ Qtのシグナルは、複数のスレッドを扱うときに使用され、メインスレッド(視覚的なことが起こる場所)で何かを実行する必要があります。 Pyside/Qtの信号は、アクションを接続する(たとえば、表示されているイメージにボタンをクリックする)場合にも使用されます。

あなたの例では、クラスを互いに知っている(互いに参照している)ようにして、必要なときにメッセージを送信するのが最もよいと思います。たとえば、setupUIを呼び出すと、mainWindowを引数として渡します。そのメソッドの中では、

def setupUi(self, MainWindow): 
    self._mainWindow = MainWindow 
    mainWindow.setUi(self) 

のようなものがあります。setUiメソッドは、そのクラスを属性として保存します。次に、DropEventで、別のメッセージの引数としてUIへのパスを送信するだけです。

関連する問題