QSignalMapper如何工作?

时间:2014-06-17 09:37:33

标签: c++ qt qt-signals slot qsignalmapper

我的帖子发布后:Associate signal and slot to a qcheckbox create dynamically我需要关联:

•点击clicked()到我的函数qCheckBox时的信号cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

要做到这一点,我必须使用QSignalMapper,经过两个小时的尝试来了解它的工作原理后,我无法取得好成绩,这是我制作的代码,这个显然是错的:

 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如何运作吗?我真的不明白要联系的内容:(

2 个答案:

答案 0 :(得分:11)

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

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));

对于每个按钮,您可以将clicked()信号连接到map()的{​​{1}}广告位,并使用setMapping添加映射,以便在QSignalMapper发出信号时发出信号按钮,发出信号clicked()

mapped(QWidget *)

这样,无论何时单击按钮,都会发出映射器的QPushButton * but = new QPushButton(this); QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map())); mapper->setMapping(but, but); 信号,其中包含小部件作为参数。

答案 1 :(得分:7)

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

QSignalMapper工作原理:

创建s QSignalMapper。让我们假设您要为每个复选框分配一个整数值,因此每次单击任何复选框时,您将获得一个分配了整数值的信号。

将映射器信号连接到您要执行的SLOT:

connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int)));

现在你可以编写插槽,它将采用整数参数。您拥有的每个复选框的参数都不同。

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

mapper->setMapping(checkBox, integerValueForThisCheckbox);
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map()));

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

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

这就是QSignalMapper的工作方式。

您不需要它:

  • QTableWidget *monTab是单个对象,不会更改。将其保留为类成员字段,并从插槽函数中使用它。
  • QCheckBox *pCheckBox - 您可以通过将sender()投射到QCheckBox*来获取它。

像这样:

void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;
}

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

  • int linge(这是一个行号,对吗?) - 当您创建复选框时,您可以在QList类字段中存储指向该复选框的指针,并在您的插槽函数中使用它找出哪一行就是这样:

在课堂宣言中:

private:
    QList<QCheckBox*> checkboxes;

创建复选框时:

QCheckBox* cb = new QCheckBox();
checkboxes << cb;

在你的插槽功能中:

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并使用mapper为复选框指定行。这只是你喜欢的问题。