我在PyQt上开发了一个应用程序,我喜欢信号槽模型,但有没有办法 确定信号的发射器?我希望有一种方法,因为它可以编写更多通用代码而无需为每个类似信号定义大量插槽。
答案 0 :(得分:18)
我认为我过早地提出了一个问题,因为我自己在谷歌上找到了答案。 当插槽由发射器激活时,发射器的指针存储,并可通过
检索QObject::sender()
因此可以在PyQt中访问:
@QtCore.pyqtSlot()
def someSlot(self):
self.sender()
答案 1 :(得分:1)
您可能希望查看QSignalMapper类,因为它提供了将int,string或widget参数与发送给定信号的对象相关联的方法。主要限制是被映射的信号/插槽需要无参数。
的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示例时。
答案 2 :(得分:0)
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:
....
文档(质量差):
映射可以是空的(传递源对象引用)、基于整数、基于字符串或基于对象。根据我从文档中的理解,不同类型可以混合使用,映射器识别哪个映射与源相关联,并调用适当的回调。如果为同一个源设置了多个映射会发生什么情况没有说,因此需要进行一些实验。很遗憾,对于这么有趣的产品,文档太差了。
答案 3 :(得分:-3)
请注意,这并不会告诉你,例如。网格控件中的哪个单元格正好 - 只是网格控件处理本身。
有一本新的高级Qt书出版了很多有关高级信号/插槽路由的详细信息