PyQt4 和 PyQt5 中的 QFileDialog 字符串有区别吗?
Posted
技术标签:
【中文标题】PyQt4 和 PyQt5 中的 QFileDialog 字符串有区别吗?【英文标题】:Is there a difference between QFileDialog strings in PyQt4 and PyQt5? 【发布时间】:2017-10-31 17:30:44 【问题描述】:我有一段代码可以使用 Python3 和 PyQt5 打开 QFileDialog:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFileDialog
import sys
class MCVE(QWidget):
def __init__(self):
super().__init__()
self.initialize()
def initialize(self):
self.setWindowTitle('MCVE')
self.setGeometry(50, 50, 400, 200)
btn = QPushButton('Example', self)
btn.clicked.connect(self.clicked)
self.show()
def clicked(self):
filename = QFileDialog.getOpenFileName(
self, "Open Template", "c:\\",
"Templates (*.xml);;All Files (*.*)")
print(filename)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MCVE()
sys.exit(app.exec_())
在使用 PyQt4 的 Python 2 中,print(filename) 语句在按下取消按钮后输出为空字符串。当我使用 PyQt5 在 Python 3 中运行相同的代码时,我得到:
('', '')
注意:引号是单引号
有人可以解释发生了什么吗?我在 PyQt4 和 PyQt5 之间的文档下找不到任何内容。我知道字符串在 Python 2 和 Python 3 之间发生了变化,但我不确定这些变化会导致这样的问题。谢谢!
【问题讨论】:
目前尚不清楚标题中的 AttributeError 如何涉及您在正文中描述的任何内容。您是否收到 AttributeError? @eyllanesc 这完全是我的错,当我点击“提问”时,在我弄清楚发生了什么之前我要问一个之前的问题。所以标题就是从那里设定的。我已经更新了!! @eyllanesc 在 Python 2.7.14 和 PyQt 4.11.4 中似乎是空的 【参考方案1】:PyQt4 中的getOpenFileName
函数返回一个字符串,它是所选文件的名称,如果没有选择则返回一个空字符串。
filename = QFileDialog.getOpenFileName(self, "Open Template", "c:\\", "Templates (*.xml);;All Files (*.*)")
但是在 PyQt5 中,这会返回一个包含 2 个元素的元组,其中第一个元素是与 PyQt4 具有相同行为的字符串,第二个元素是使用的过滤器。
filename, filters = QFileDialog.getOpenFileName(self, "Open Template", "c:\\", "Templates (*.xml);;All Files (*.*)")
注意:PyQt5 的大部分文档都在 Qt5 中,因为通常方法的名称、输入和结果是相似的。
【讨论】:
在这种情况下,消除过滤器部分的最可靠方法是什么,所以我得到一个只有路径名和文件的字符串?转换为 PyQt5 时基本上模仿 PyQt4 的行为。示例 C:\SomeArbitraryDirectory\file.xml 询问后才看到,谢谢!就像你描述的那样工作以上是关于PyQt4 和 PyQt5 中的 QFileDialog 字符串有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章
PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用
在一个应用程序中同时支持 PyQt4 和 PyQt5 的常用方法是啥?
如何通过按下 Pyqt5 或 PyQt4 工具栏中的按钮来设置表单的显示