【问题标题】:What is the asterisk for in signal and slot connections?信号和插槽连接中的星号是什么?
【发布时间】:2016-11-22 06:05:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: python qt pyqt signals-slots


    【解决方案1】:

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

    您可以将其视为“按引用传递”,而不是“按值传递”。

    【讨论】:

    • 感谢您的回答,James,但我使用的是 Python,而不是 C++。
    • 当然,但是 PyQt 信号的签名是用 C++ 语法定义的,除非我完全弄错了。 This 肯定建议是这样的。
    【解决方案2】:

    需要解释的几个要点(我会尽量避免使用 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

    【讨论】:

    • 谢谢,乔恩!这是一个非常清楚的解释。你为我解开了一些谜团。
    • @PProteus 出于好奇,这里是同一行代码,但采用了新式语法:self.myList.itemClicked.connect(self.ListEventHandler)
    • 旧式语法已过时,pyqt5 不再支持。您根本不应该在新的 pyqt 代码中使用它——它仅在 pyqt4 中支持以实现向后兼容性。
    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多