【问题标题】:How to determine who emitted the signal?如何确定是谁发出了信号?
【发布时间】:2021-05-13 06:56:50
【问题描述】:

我在 PyQt 上开发了一个应用程序,我喜欢信号槽模型,但是有什么办法可以 确定信号的发射器?我希望有一种方法,因为它可以让编写更通用的代码,而无需为每个相似的信号定义大量的插槽。

【问题讨论】:

  • 听到有人说需要有关插槽中发件人的信息使代码通用,我真的很惊讶。一般来说,插槽是这样编写的,因此它们不需要任何关于它们是如何被激活的知识(即它们也可以直接作为方法调用)。
  • @Aconcagua 根据发布日期,我的问题比您提到的问题早 9 个月提出
  • @kravitz “10 月 28 日问 '10 20:18”。 ..
  • @Aconcagua 你是对的,那么这可能确实是重复的。

标签: python pyqt


【解决方案1】:

我觉得我提的问题太早了,因为我自己在google上找到了答案。 当slot被发射器激活时,存储发射器的指针,可以通过

QObject::sender()

因此可以通过以下方式在 PyQt 中访问:

@QtCore.pyqtSlot()
def someSlot(self):
    self.sender()

【讨论】:

【解决方案2】:

您可能想查看QSignalMapper 类,因为它提供了一种将int、字符串或小部件参数与发送给定信号的对象相关联的方法。主要限制是被映射的信号/槽需要无参数。

QT4.7 documentation: 中的 C++ 示例:

 ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
     : QWidget(parent)
 {
     signalMapper = new QSignalMapper(this);

     QGridLayout *gridLayout = new QGridLayout;
     for (int i = 0; i < texts.size(); ++i) {
         QPushButton *button = new QPushButton(texts[i]);
         connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
         signalMapper->setMapping(button, texts[i]);
         gridLayout->addWidget(button, i / 3, i % 3);
     }

     connect(signalMapper, SIGNAL(mapped(const QString &)),
             this, SIGNAL(clicked(const QString &)));

     setLayout(gridLayout);
 }

你可以找到一个 PyQT4 示例 here,但是当我有机会时,我会尝试添加一个简单的 PyQT4 示例。

【讨论】:

    【解决方案3】:

    Qt5 选项是使用信号映射器。它是一个能够接收来自不同来源的信号并使用唯一参数调用单个回调函数(插槽)的对象。然后该函数使用该参数来确定源。假设我们要将两个复选框连接到同一个插槽:

    创建信号映射器:

    signalMapper = QSignalMapper()
    

    int 类型的映射与回调函数相关联:

    signalMapper.mapped[int].connect(sync_checkboxes)
    

    将触发信号的小部件连接到映射器:

    checkbox_1.clicked.connect(signalMapper.map)
    checkbox_2.clicked.connect(signalMapper.map)
    

    定义源和 int 值(0 和 1)之间的映射:

    signalMapper.setMapping(checkbox_1, 0)
    signalMapper.setMapping(checkbox_2, 1)
    

    现在回调接受整数值:

    def sync_checkboxes(index):
        if index == 0:
            ....
    

    文档(质量差):

    映射可以是 void(传递源对象引用)、基于整数、基于字符串或基于对象。根据我从文档中了解到的情况,可以混合不同的类型,映射器识别与源关联的映射,并调用适当的回调。没有说如果为同一个源设置了多个映射会发生什么,因此需要进行一些实验。遗憾的是,对于如此有趣的产品,文档是如此糟糕。

    【讨论】:

      【解决方案4】:

      请注意,这不会告诉您,例如。编辑了网格控件中的哪个单元格 - 只是网格控件句柄本身。

      有一本新的 Advanced Qt book out,其中详细介绍了高级信号/插槽路由

      【讨论】:

      • 书名和作者是什么?我试图弄清楚如何使 QLineEdit 字段可双击,以便获取信号的函数:(1l)获取 QLineEdit 字段的名称(句柄?),并且(2)可以检索或设置QLineEdit 字段中的文本。我正在寻找一本书或教程来告诉我如何做到这一点。
      • 那是 8 年前的帖子,不知道与最新的 Qt 是否相关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多