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

PySide: Why is File Browser coming up automatically, not after button press?

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

相关部分是:

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 有什么不同吗?

完整代码:

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. 问题是由错误的连接产生的。连接方式如下:

{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. 根据文档:

void QAbstractButton::toggled(bool checked)

This signal is emitted whenever a checkable button changes its state. checked is true if the button is checked, or false if the button is unchecked.

void QAbstractButton::clicked(bool checked = false)

This signal is emitted when the button is activated (i.e., pressed down then released while the mouse cursor is inside the button), when the shortcut key is typed, or when click() or animateClick() is called. Notably, this signal is not emitted if you call setDown(), setChecked() or toggle().

在第一种情况下,您必须通过以下方式启用检查:

self.pushButton.setCheckable(True)

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

  1. 没有必要传递参数 MainWindow 但你会用到它。在您的情况下,您可以将其更改为:

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

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