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 字符串有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 支持不从 QObject 继承的类中的信号

PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用

在一个应用程序中同时支持 PyQt4 和 PyQt5 的常用方法是啥?

如何通过按下 Pyqt5 或 PyQt4 工具栏中的按钮来设置表单的显示

PyQt 5.4参考指南 ---- PyQt5和PyQt4之间的差异

将 PyQt4 代码适配到 PyQt5,SIGNAL 问题