gpt4 book ai didi

python - QFileDialog - PyQt4/PyQt5/PySide 之间的区别

转载 作者:太空狗 更新时间:2023-10-30 02:10:16 25 4
gpt4 key购买 nike

我一直在研究 Summerfields 关于使用 Python 和 QT(更准确地说是 PyQt)进行快速 GUI 编程的书,但是 2007 年的书使用的是 4.x 版,我正在尝试使用当前版本( 5.4.2).

我正在尝试找出一些更改,希望获得有关如何查找内容的帮助。这是文件保存对话框的示例 - 来自书中:

    fname = QFileDialog.getSaveFileName(self,
"Image Changer - Save Image", fname,
"Image files ({})".format(" ".join(formats)))

这不起作用,可能主要是因为在 PyQt5 中,QFileDialog 返回一个元组而不是字符串。我能弄清楚这一点的唯一方法就是反复试验。 PyQt5文档指的是QT,我真的不明白。

我得到了以下的工作:

   fname = QFileDialog.getSaveFileName(self, 'some text',
"whatever.png", '*.png')
if "." not in fname[0]:
fname[0] += ".png"
self.addRecentFile(fname[0])
self.filename = fname[0]
return self.fileSave()

哇,好用!但只有通过艰苦奋斗,我才能取得任何进展。我尝试运行 python 解释器并输入:

from PyQt5.QtWidgets import  QFileDialog

help(QFileDialog)

这(有点)有用,但帮助的语法对我来说意义不大,而且我看不到 getSaveFileName 应该返回什么。

我错过了什么?

最佳答案

QFileDialog 的一些静态函数在 PyQt 中有一段奇怪的历史。如果您不知道这段历史,就很难理解 PyQt 各个版本之间的差异。

根本问题很简单。在 Python 中,如果一个函数需要返回多个值,最常见的解决方案是返回一个元组。但在 C++ 中,这实际上是不可能的,因此通常的解决方案是提供可以修改的参数。

QFileDialog.getSaveFileName 的 C++ 签名这是:

getSaveFileName(
QWidget * parent = 0, const QString & caption = String(),
const QString & dir = QString(), const QString & filter = QString(),
QString * selectedFilter = 0, Options options = 0)

如您所见,四个 QString 参数并不完全相同。前三个是 const,因此不会被函数修改,但是 selectedFilter 参数接受一个指向 QString 的指针,它意味着可以。

最初,PyQt 的主要用途是用于 C++ 原型(prototype)设计(而不是开发 Python 应用程序),因此它的 API 更忠实于 Qt API。这意味着,在 PyQt-4.6 之前,唯一QFileDialog 中获取所选过滤器的方法是使用 C++ 方式,如下所示:

>>> s = QString() # string to be modified
>>> f = QFileDialog.getSaveFileName(None, 'Save', '', 'Img(*.png *.jpg)', s)
>>> print s
Img(*.png *.jpg)

事实上,这在当前版本的 PyQt4 中仍然有效(当然,前提是启用了 QString)。

PyQt4 稳步引入了许多变化,这些变化多年来逐渐使它对 Python 越来越友好 - 但正如上面的示例所示,这一切都是在没有破坏向后兼容性的情况下完成的。当时,更改 getSaveFileName 的签名以返回元组会造成太多破坏,因此添加了 getSaveFileNameAndFilter 等函数作为临时妥协。

PyQt5 没有这样的限制(它甚至不需要再提供QString)。因此,最终可以做正确的事情(从 Python 的角度来看),只需从 getSaveFileName 返回一个元组。这个原则现在普遍适用:如果您使用 PyQt5,并且您在 Qt 文档中看到一个修改其参数的函数,您总是可以期望返回一个元组。


(PS:PySide 的用户——它比 PyQt 年轻得多——从来不必处理这些问题。对于他们来说,静态 QFileDialog 函数总是做正确的事)。

关于python - QFileDialog - PyQt4/PyQt5/PySide 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30930835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com