我从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()
终止我的申请?
答案 0 :(得分:0)
我终于找到了(非常小的)错误:
虽然PyQt4
显然会自动将路径写为string
,但PyQt5
却没有。
我改变了
self.ui.savepath_label.setText(path)
进入
self.ui.savepath_label.setText(str(path))
现在一切都很好。
答案 1 :(得分:0)
PyQt4提供了两种不同的API:
QString
之类的内容传递给setText
方法str
传递给它们。在this page中提到了有关PyQt4的内容。 PyQt5 only supports version 2 of the API(该页面还提到了其他差异)。
另请注意,根据问题pyqt5 - finding documentation,PyQt5
方法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
。