繁体   English   中英

如何确定谁发出了信号?

[英]How to determine who emitted the signal?

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

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

QObject::sender()

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

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

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

QT4.7 文档中的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 示例,但是当我有机会时,我会尝试添加一个简单的 PyQT4 示例。

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

文件(质量差):

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM