在 Python Qt 中,我将 QListWidget 信号连接到插槽,如下所示:
QtCore.QObject.connect(self.myList, QtCore.SIGNAL("itemClicked(QListWidgetItem *)"), self.ListEventHandler)
我的问题是:QListWidgetItem * 中尾随的星号有什么作用?
请您参考如下方法:
要解释的几个要点(我将尽量避免使用 C++ 语法):
- PyQt 是用 C++ 编写的 Qt 的 Python 包装器。
- Qt 为继承自
QObject的类提供内省(introspection),经常使用字符串来识别事物。 Python 具有 native 自省(introspection)功能,但 C++ 没有。 - 您使用的语法称为 "Old-Style Signals and Slots" ,它使用 C++ 函数签名。
- C++ 的变量类型比 Python 多。在 C++ 中,变量可以是值、引用或指针。 指针在其类型名称后有一个星号。
QtCore.SIGNAL("itemClicked(QListWidgetItem *)")指的是一个名为itemClicked的 Qt 信号,它的参数是一个指针 到QListWidgetItem,而不是项目本身。
在 C++ 中,这看起来像:
void itemClicked(QListWidgetItem *item);
回到字符串进行自省(introspection),识别信号或槽,你删除void,;,和变量名(item), 离开:
itemClicked(QListWidgetItem *)
将上面的内容包装在 QtCore.SIGNAL() 和一对引号中,你有:
QtCore.SIGNAL("itemClicked(QListWidgetItem *)")
什么是指针?
关于这个有很多问题。 Here is one答案中有许多类比可以为您简化事情。
如果这是旧式语法,那么新式是什么?
感谢 Frodon 提出这个问题。 PyQt 有一种更“pythonic”的方法将信号连接到槽,格式如下:
object.signalName.connect(otherObject.slotName)
在这种情况下:
self.myList.itemClicked.connect(self.ListEventHandler)
阅读更多 in the docs .
