2017-06-20 2 views
2

J'essaie de créer un programme qui permet à l'utilisateur de sélectionner manuellement un fichier ou simplement de faire glisser un fichier dans le MainWindow.Pyside/PyQt: Comment envoyer des informations entre les classes

Le navigateur de fichiers fonctionne et MainWindow accepte gouttes, mais je ne peux pas comprendre comment:

  1. Get filePath hors de la classe myMainWindow et en classe Ui_MainWindow
  2. changement pushButton texte d « » Fichier sélectionné 'quand un fichier a été abandonné.

Il semble que j'ai besoin d'utiliser emit()/signal() pour envoyer des informations entre les deux classes mais je n'arrive pas à comprendre comment les connecter.

code complet:

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

Vous pourriez mieux expliquer le premier point. – eyllanesc

+1

Lorsque j'exécute ce code, il affiche une énorme fenêtre avec un bouton intitulé "Parcourir". Quand j'appuie sur ce bouton, une fenêtre QFileDIalog apparaît et une fois que je sélectionne un fichier, le texte sur le bouton devient "Fichier sélectionné". Donc, au moins une des choses que vous voulez arriver arrive. – mauve

+1

Je vous interroge sur le premier point – eyllanesc

Répondre

2

La seule façon de « envoyer des informations entre les classes » (ou faire communiquer) dans toutes les langues orientée objet est à travers des messages (par exemple les méthodes de python). Les signaux de Pyside/Qt sont utilisés lorsque vous traitez plusieurs threads et que vous avez besoin de quelque chose à exécuter dans le thread principal (où les choses visuelles se produisent). Les signaux de Pyside/Qt sont également utilisés lorsque vous voulez connecter une action (par exemple en cliquant sur un bouton pour afficher une image).

Dans votre exemple, je pense que le mieux serait que les classes se connaissent (ont des références les unes aux autres) et envoient des messages si nécessaire. Par exemple, lorsque vous appelez setupUI, vous passez en argument MainWindow. À l'intérieur de cette méthode, vous pourriez avoir quelque chose comme

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

La méthode setUi enregistrerait cette classe en tant qu'attribut. Ensuite, sur DropEvent, vous pouvez simplement envoyer le chemin vers l'interface utilisateur en tant qu'argument d'un autre message.