2016-07-19 54 views
1

在Python Qt的,我是一個QListWidget信號連接到插槽中,這樣的:信號和插槽連接的星號是什麼?

QtCore.QObject.connect(self.myList, QtCore.SIGNAL("itemClicked(QListWidgetItem *)"), self.ListEventHandler) 

我的問題是:是什麼在QListWidgetItem *尾隨星號呢?

回答

5

一對夫婦的要點講解(我會盡量避免C++的語法):

  • PyQt的是Qt的周圍,這是用C++編寫Python的包裝。
  • Qt爲從QObject繼承的類提供反思,經常使用字符串來標識事物。 Python有本地反思,但C++沒有。
  • 您使用的語法被稱爲"Old-Style Signals and Slots",它使用C++函數簽名。
  • C++比Python有更多類型的變量。在C++中,變量可以是值,引用或指針。 指針在其類型名稱後面有一個星號。
  • QtCore.SIGNAL("itemClicked(QListWidgetItem *)")指稱爲itemClicked一個Qt信號,其具有一個參數,是一個指針QListWidgetItem,而不是物品本身。

在C++中,這看起來像:

void itemClicked(QListWidgetItem *item); 

再回到字符串內省,以識別信號或狹槽,則丟棄該void,所述;,和變量名(item),離開:

itemClicked(QListWidgetItem *) 

包裹上面QtCore.SIGNAL()和一對引號,你必須:

QtCore.SIGNAL("itemClicked(QListWidgetItem *)") 

什麼是指針?
有很多關於此問題的SO問題。 Here is one在答案中提供了一些類比以簡化您的工作。

如果這是舊式的語法,有什麼新風格?
感謝Frodon提出這一點。 PyQt的具有信號連接到狹槽,在格式的更 「Python化」 的方法:

object.signalName.connect(otherObject.slotName) 

在這種情況下:

self.myList.itemClicked.connect(self.ListEventHandler) 

更多in the docs

+0

謝謝,喬恩!這是一個非常明確的解釋。你已經爲我解開了一些謎團。 – PProteus

+2

@PProteus對於curiosoty,這裏是相同的代碼行,但是在新式語法中:'self.myList.itemClicked.connect(self.ListEventHandler)' – Frodon

+2

舊式語法已過時,不再是在pyqt5中受支持。你不應該在新的pyqt代碼中使用它 - 它只在pyqt4中支持向後兼容。 – ekhumoro

2

它是C++語法,用於指示函數itemClicked傳遞指向作爲其唯一參數的QListWidgetItem的指針。

您可以將此視爲「通過引用傳遞」,而不是「按值傳遞」。

+0

感謝您的回答,James,但我使用Python,而不是C++。 – PProteus

+2

當然,但PyQt信號的簽名是用C++語法定義的,除非我完全錯誤。 [This](http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html)當然表明情況是這樣的。 –