信号和槽连接中的星号是什么?

What is the asterisk for in signal and slot connections?

在 Python Qt 中,我将 QListWidget 信号连接到插槽,如下所示:

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

我的问题是:QListWidgetItem * 中的尾随星号有什么作用?

这是 C++ 语法,用于指示函数 itemClicked 传递一个指向 QListWidgetItem 的指针作为其唯一参数。

您可以将其视为 "pass by reference",而不是 "pass by value"。

要解释的几个要点(我将尽量避免使用 C++ 语法):

  • PyQt 是 Qt 的 Python 包装器,它是用 C++ 编写的。
  • 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 *)")

什么是指针?
关于这个有很多问题。 Here is one 答案中有许多类比,为您简化事情。

如果这是旧式语法,那么新式是什么?
感谢 Frodon 提出这个问题。 PyQt有一个更"pythonic"的连接信号槽的方法,格式为:

object.signalName.connect(otherObject.slotName)

在这种情况下:

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

阅读更多in the docs