2015-06-19 73 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