PySide:为什么文件浏览器会自动启动,而不是按下按钮后?

时间:2017-06-14 21:16:54

标签: python button pyqt pyside qfiledialog

我正在尝试通过按钮上的单击来实现文件浏览器。我目前的问题是,当我运行此代码时,文件浏览器会自动出现。

相关部分是:

def myChanges(self, MainWindow):
    self.pushButton.connect(self.selectFile())

def selectFile(self):
    filePath = QtGui.QFileDialog.getOpenFileName()
    print(filePath)

我的问题是:

  1. 如何在单击按钮后才显示文件对话框?
  2. self.pushButton.toggled.connect(self.selectFile())self.pushButton.clicked.connect(self.selectFile())做不同的事情吗?
  3. MainWindow传递给selectFile的做法有何不同?
  4. 完整代码:

    from PySide import QtCore, QtGui
    
    class Ui_MainWindow(object):
        def selectFile(self, MainWindow):
            filePath = QtGui.QFileDialog.getOpenFileName()
            print(filePath)
    
        def myChanges(self, MainWindow):
            self.pushButton.connect(self.selectFile())
    
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton = QtGui.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(30, 40, 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(MainWindow)
    
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
            self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
    
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

1 个答案:

答案 0 :(得分:3)

  1. 问题是由错误的连接产生的。连接方式如下:
  2. {sender}.{your_signal}.connect({your_slot})
    

    在你的情况下它应该是self.pushButton.clicked.connect(self.selectFile),为此你必须改变:

    def myChanges(self, MainWindow):
        self.pushButton.connect(self.selectFile())
    

    为:

    def myChanges(self, MainWindow):
        self.pushButton.clicked.connect(self.selectFile)
    
    1. 根据文件:
    2.   

      void QAbstractButton :: toggled(bool checked)

           

      发出此信号   每当可检查按钮改变其状态时。如果是,则检查为真   按钮被选中,如果未选中该按钮则为假。

           

      void QAbstractButton :: clicked(bool checked = false)

           

      这个信号是   按钮被激活时发出(即,按下然后释放)   当鼠标光标在按钮内时,快捷键是   键入,或者调用click()或animateClick()时。值得注意的是,这   如果调用setDown(),setChecked()或toggle(),则不会发出信号。

      在第一种情况下,您必须启用checkeable:

      self.pushButton.setCheckable(True)
      

      在切换的情况下,这会为您提供一个更加调用的isChecked属性,该属性在True和False之间交替。对于你的问题,没有必要。

      1. 没有必要传递参数MainWindow,但您将使用它。在您的情况下,您可以将其更改为:
      2. def selectFile(self):
            filePath = QtGui.QFileDialog.getOpenFileName()
            print(filePath)
        
        def myChanges(self):
            self.pushButton.clicked.connect(self.selectFile)