在QFileDialog弹出窗口中按下按钮退出应用程序

时间:2016-06-22 11:58:52

标签: python qt pyqt pyqt5 qfiledialog

我从PyQt4过渡到PyQt5。我的应用程序(使用QtDesigner创建)有一个复选框,可以启用“保存”按钮,以防您想要保存文件。在PyQt4对话框打开,我选择我的文件,按OK,完成。我对主应用程序的“确定”按钮进行了检查,如果路径无效,则会提示错误,例如:如果你在QFileDialog按下取消。

如果以任何方式关闭PyQt5,我的应用程序将完全退出(OK,取消,X)。我想只关闭QFileDialog而不是我的主窗口。我该怎么做呢?感谢您的时间和帮助。

这是我的代码的相关部分:

QFileDialog

编辑:

我知道我的错误所在,但我仍然无法修复它。我在代码中标记了这一行。为什么self.path = self.ui.savepathButton.pressed.connect(lambda: self.file_save()) def file_save(self): path = QFileDialog.getSaveFileName(self, "Choose a path and filename", os.getcwd().replace("\\", "/") + "/test.stl", filter="Stereolithography Files (*.stl)") self.ui.savepath_label.setText(path) <------ NO ERROR WITHOUT THIS LINE def OKButton_click(self): if os.path.isdir(os.path.split(self.ui.savepath_label.text())[0]) is False: # Warning if the filename is invalid. file_error = QMessageBox() file_error.setIcon(QMessageBox.Warning) file_error.setText("Invalid path or filename.") file_error.setInformativeText("Please choose a working path and filename.") file_error.setWindowTitle("File name error") file_error.setStandardButtons(QMessageBox.Ok) file_error.exec_() else: self.accept() 终止我的申请?

2 个答案:

答案 0 :(得分:0)

我终于找到了(非常小的)错误:

虽然PyQt4显然会自动将路径写为string,但PyQt5却没有。

我改变了

self.ui.savepath_label.setText(path)

进入

self.ui.savepath_label.setText(str(path))

现在一切都很好。

答案 1 :(得分:0)

PyQt4提供了两种不同的API:

  • API v1使用对象的Qt类型,因此您必须将QString之类的内容传递给setText方法
  • API v2改为使用python类型,Qt对象的方法会自动将这些python类型转换为它们的Qt变体,因此你必须将python str传递给它们。

this page中提到了有关PyQt4的内容。 PyQt5 only supports version 2 of the API(该页面还提到了其他差异)。

另请注意,根据问题pyqt5 - finding documentationPyQt5方法getSaveFileName实际上会返回一对(filename, filter),因此它实际上等同于PyQt4的getSaveFileNameAndFilter方法,这意味着你可以简单地使用:

self.ui.savepath_label.setText(path[0])

设置文字。最小的完整示例:

from PyQt5.QtWidgets import  QFileDialog, QWidget, QApplication, QHBoxLayout, QPushButton


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__(None)
        layout = QHBoxLayout()
        self.button = QPushButton('click')
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.button.clicked.connect(self.ask_filename)
    def ask_filename(self):
        fname = QFileDialog.getSaveFileName(self, 'title')
        print(fname)
        self.button.setText(fname[0])


app = QApplication([])
window = Window()
window.show()
app.exec_()

顺便说一句,如果您将fname[0]更改为fname并尝试从终端启动此应用程序,则会收到以下有用的错误消息:

Traceback (most recent call last):
  File "test_qt.py", line 15, in ask_filename
    self.button.setText(fname)
TypeError: QAbstractButton.setText(str): argument 1 has unexpected type 'tuple'

告诉您getSaveFileName的返回类型是元组而不是str