pyqt5 - 查找文档

Kei*_*ler 4 python qt pyqt qfiledialog pyqt5

我一直在使用Summerfields关于使用Python和QT快速GUI编程的书... pyqt是精确的,但2007年的书使用版本4.something我试图使用当前版本5.4.2. .

我想弄清楚有一些变化,并希望得到一些如何找到东西的帮助.以下是文件保存对话框的示例 - 来自书籍:

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

这不起作用,可能主要是因为在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()
Run Code Online (Sandbox Code Playgroud)

哇,它的作品!但正是因为我正在努力,我才取得任何进展.我尝试运行python解释器并输入:

from PyQt5.QtWidgets import  QFileDialog

help(QFileDialog)
Run Code Online (Sandbox Code Playgroud)

这是(有点)有用,但帮助的语法对我来说没有多大意义,我也看不出getSaveFileName应该返回什么.这有点乏味 - @ $$的东西.

我错过了什么?

ekh*_*oro 7

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

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

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

getSaveFileName(
    QWidget * parent = 0, const QString & caption = String(),
    const QString & dir = QString(), const QString & filter = QString(),
    QString * selectedFilter = 0, Options options = 0)
Run Code Online (Sandbox Code Playgroud)

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

最初,PyQt的主要用途是用于C++原型(而不是开发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)
Run Code Online (Sandbox Code Playgroud)

事实上,这仍然适用于PyQt4的当前版本(QString当然,它已启用).

PyQt4稳步引入了许多变化,这些变化逐渐使得它越来越多地使用Python - 但正如上面的例子所示,这一切都是在破坏向后兼容性的情况下完成的.当时,更改签名getSaveFileName以返回元组会导致太多破损,因此函数会getSaveFileNameAndFilter被添加为临时折衷.

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


(PS:PySide的用户 - 比PyQt年轻得多 - 从来没有处理过这些问题.对于他们来说,静态QFileDialog函数总是做正确的事情).


thr*_*les 1

这些方法看起来QFileDialog有点特殊,因为 PyQt 实现了自己的方法而不是直接包装 Qt 方法。

首先,PyQt5方法实现了PyQt4 方法QFileDialog.getSaveFileName()的行为(来源)。其次,PyQt4 中的方法返回一个( source ) 的元组。QFileDialog.getSaveFileNameAndFilter()QFileDialog.getSaveFileNameAndFilter()(filename, selectedFilter)

作为参考,PyQt4方法的调用签名QFileDialog.getSaveFileNameAndFilter()

getSaveFileNameAndFilter (QWidget parent = None, QString caption = QString(), 
                          QString directory = QString(), QString filter = QString(), 
                          QString initialFilter = QString(), Options options = 0)
Run Code Online (Sandbox Code Playgroud)

希望这有助于解决任何困惑。大多数 PyQt5 类/方法的解码都不会那么混乱!