首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSignalMapper是如何工作的?

QSignalMapper是如何工作的?
EN

Stack Overflow用户
提问于 2014-06-17 17:37:33
回答 2查看 17.1K关注 0票数 11

在我的帖子:Associate signal and slot to a qcheckbox create dynamically之后,我需要关联:

·单击函数cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)qCheckBox时的信号clicked()

要做到这一点,我必须使用QSignalMapper,经过两个小时的尝试了解它是如何工作的,我无法得到一个好的结果,这是我制作的代码,这显然是错误的:

代码语言:javascript
复制
 QSignalMapper *m_sigmapper = new QSignalMapper(this);
 QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked()));
 QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

 m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox));
 QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

你能给我解释一下QSignalMapper是怎么工作的吗?我真的不知道该和什么联系起来:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 18:16:48

QSignalMapper类收集一组无参数信号,并使用与发送信号的对象相对应的整数、字符串或小部件参数重新发出它们。所以你可以有一个这样的:

代码语言:javascript
复制
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));

对于每个按钮,您可以将clicked()信号连接到QSignalMappermap()插槽,并使用setMapping添加映射,以便在从按钮发出clicked()信号时发出信号mapped(QWidget *)

代码语言:javascript
复制
QPushButton * but = new QPushButton(this);

QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, but);

这样,无论何时单击按钮,都会发出包含小部件作为参数的映射器的mapped(QWidget *)信号。

票数 14
EN

Stack Overflow用户

发布于 2014-06-17 18:07:55

首先,我将向您解释QSignalMapper是如何工作的。然后我会向你解释为什么你不需要它。

QSignalMapper 的工作原理:

创建%s QSignalMapper。假设您想要为每个复选框分配一个整数值,因此每次单击任何复选框时,您都会得到一个分配了整数值的信号。

将映射器信号连接到您要实现的插槽:

代码语言:javascript
复制
connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int)));

现在你可以写slot了,它将接受整数参数。每个复选框的参数都是不同的。

创建复选框时,对于每个复选框,您需要执行以下操作:

代码语言:javascript
复制
mapper->setMapping(checkBox, integerValueForThisCheckbox);
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map()));

从现在开始,每次您单击复选框时,它都会向QSignalMapper发出clicked()信号,然后它会将其映射到指定的整数值,并发出mapped()信号。您已连接到该mapped()信号,因此将使用正确的整数值调用yourSlot(int)

您可以指定QStringQWidget*QObject*,而不是整数(参见Qt文档)。

这就是QSignalMapper的工作方式。

你不需要它:

  • QTableWidget *monTab是一个单独的对象,它不会改变。将其保留为类成员字段,并在您的slot function.
  • The QCheckBox *pCheckBox中使用它-您可以通过将sender()转换为QCheckBox*.

来获取它

如下所示:

代码语言:javascript
复制
void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;
}

sender()函数来自QObject,您确实继承了它,因此您可以访问它。

创建复选框时,可以将指向该复选框的指针存储在QList类字段中,并在插槽函数中使用它来确定是哪一行,如下所示:

在类声明中:

代码语言:javascript
复制
private:
    QList<QCheckBox*> checkboxes;

创建复选框时:

代码语言:javascript
复制
QCheckBox* cb = new QCheckBox();
checkboxes << cb;

在您的slot函数中:

代码语言:javascript
复制
void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;

    int linge = checkboxes.indexOf(pCheckBox);
}

如果需要,可以跳过QList,使用QSignalMapper并使用映射器将行分配给复选框。这只是你喜欢什么的问题。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24260394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档