Skip to main content
 首页 » 编程设计

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

2025年05月04日13yxwkf

在 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 .