2015-06-19 34 views
4

我一直在通过Summerfields关于使用Python和QT进行快速GUI编程的书籍...... pyqt是更高版本,但2007年的书使用的是版本4.something,我试图与当前版本5.4.2 ..pyqt5 - 查找文档

有一些变化,我想弄清楚,并会喜欢一些帮助如何找到东西。下面是一个文件的示例保存对话框 - 从书:

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应该返回。这是一些乏味 - @ $$的东西。

我错过了什么?

+0

这可以帮助你:[阅读Qt文档](https://www.commandprompt.com/community/pyqt/a8647.htm)。它只是没有最新的信号和插槽(功能'连接')。 – Mel

+0

@tmoreau。这似乎来自2001年编写的一本书PyQt3。 – ekhumoro

回答

1

这些方法QFileDialog似乎有点特殊,因为PyQt已经实现了自己的方法而不是直接包装Qt方法。首先,PyQt5 QFileDialog.getSaveFileName()方法从PyQt4(source)实现了方法QFileDialog.getSaveFileNameAndFilter()的行为。其次,PyQt4中的QFileDialog.getSaveFileNameAndFilter()方法返回一个(filename, selectedFilter)source)的元组。

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

getSaveFileNameAndFilter (QWidget parent = None, QString caption = QString(), 
          QString directory = QString(), QString filter = QString(), 
          QString initialFilter = QString(), Options options = 0) 

希望这有助于解决任何混乱。大多数PyQt5类/方法不会被这个解码混淆!

5

一些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++原型输入(而不是开发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功能一直做正确的事)。

+0

我不敢相信这从来没有得到任何upvotes - 这解释完全一直在发生,并给了我如何解释文件的指导。谢谢!更糟的是,如果你没有历史记录,并且你去了官方的PyQt5文档参考,那么QFileDialog中的所有内容都是一个指向C++文档的指针(当然这只是返回一个QString)。注意到潜在的修改参数将是关键! – Ajean