Pyqt5 QFileDialog 在我的获取目录程序中不起作用

Posted

技术标签:

【中文标题】Pyqt5 QFileDialog 在我的获取目录程序中不起作用【英文标题】:Pyqt5 QFileDialog not working in my program for Getting Directories 【发布时间】:2019-04-11 09:44:10 【问题描述】:

我有这个 Qt MainWindow 如下所示:

我希望我的浏览按钮打开一个对话框以选择特定目录。 我浏览了 Stack Overflow 上的各种 post,我尝试在帖子中实现解决方案,但它对我不起作用。

这是我的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import os
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.start_button = QtWidgets.QPushButton(self.centralwidget)
        self.start_button.setAutoFillBackground(False)
        self.start_button.setAutoDefault(False)
        self.start_button.setDefault(False)
        self.start_button.setFlat(False)
        self.start_button.setObjectName("start_button")
        self.start_button.clicked.connect(lambda: self.start_button_click())
        self.gridLayout_2.addWidget(self.start_button, 0, 0, 1, 1)
        self.Br_button = QtWidgets.QPushButton(self.centralwidget)
        self.Br_button.setObjectName("Br_button")
        self.Br_button.clicked.connect(lambda: self.browse_button())
        self.gridLayout_2.addWidget(self.Br_button, 2, 0, 1, 1)
        self.label = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 2, 1, 1, 1, QtCore.Qt.AlignHCenter)
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.gridLayout_2.addWidget(self.tableWidget, 3, 0, 1, 2)
        self.gridLayout.addLayout(self.gridLayout_2, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)

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


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.start_button.setToolTip(_translate("MainWindow", "Start The Program"))
        self.start_button.setText(_translate("MainWindow", "Start"))
        self.Br_button.setToolTip(_translate("MainWindow", "Browse the File Location to Watch on"))
        self.Br_button.setText(_translate("MainWindow", "Browse"))


    def start_button_click(self):
        self.label.setText("Hello")

    def browse_button(self):
        fileName = QtWidgets.QFileDialog.getExistingDirectory(QtWidgets.QFileDialog,None,"Open Directory",os.getcwd(), QtWidgets.QFileDialog.ShowDirsOnly)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

当我单击“浏览”按钮时,它会在几秒钟后突然关闭应用程序,我收到如下所示的此错误:

【问题讨论】:

@Isma 详细信息已添加! 【参考方案1】:

试试看:

import sys
import os
from PyQt5.QtGui     import *
from PyQt5.QtCore    import *
from PyQt5.QtWidgets import *


class Form(QMainWindow):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.plainTextEdit = QPlainTextEdit()
        self.plainTextEdit.setFont(QFont('Arial', 11))

        openDirButton = QPushButton("Open Directory")
        openDirButton.clicked.connect(self.browse_button)
        layoutV = QVBoxLayout()
        layoutV.addWidget(openDirButton)
        layoutH = QHBoxLayout()
        layoutH.addLayout(layoutV)
        layoutH.addWidget(self.plainTextEdit)
        centerWidget = QWidget()
        centerWidget.setLayout(layoutH) 
        self.setCentralWidget(centerWidget)

    def browse_button(self):

        fileName = QFileDialog.getExistingDirectory(
                       #QtWidgets.QFileDialog,                  # ???
                       None,
                       "Open Directory",
                       os.getcwd(), 
                       QFileDialog.ShowDirsOnly)
        self.plainTextEdit.appendhtml("<br>Chose a folder: <b></b>".format(fileName)) 


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Form()
    ex.resize(740,480)
    ex.setWindowTitle("PyQt5-QFileDialog")
    ex.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于Pyqt5 QFileDialog 在我的获取目录程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Pyinstaller 的 PyQT5 QFileDialog 问题

Python:如何获取 PyQt5 中选定文件的文件大小?

PyQT5 QFileDialog窗口标题未在mac上显示

PyQt4 和 PyQt5 中的 QFileDialog 字符串有区别吗?

PyQt4和PyQt5中的QFileDialog字符串有区别吗?

PyQt5中的按钮连接有啥问题?