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

2024-04-25 19:54:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过点击按钮来实现一个文件浏览器。我当前的问题是,当我运行此代码时,文件浏览器会自动出现。你知道吗

相关部分包括:

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_())

Tags: 文件selfdefconnectqtguifilepathqapplicationstatusbar
1条回答
网友
1楼 · 发布于 2024-04-25 19:54:39
  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)

在toggled的情况下,这将为您提供一个更称为isChecked的属性,该属性在True和False之间交替出现。对于你的问题没有必要。你知道吗

  1. 不需要传递参数main窗口,但您将使用它。您可以将其更改为:

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

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

相关问题 更多 >