QSignalMapper如何工作?

Eva*_*eil 11 c++ qt slot qt-signals qsignalmapper

我在这里发布后:将信号和插槽关联到qcheckbox动态创建我需要关联:

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)));
Run Code Online (Sandbox Code Playgroud)

你能解释一下,怎么样QSignalMapper?我真的不明白要联系到什么:(

Nej*_*jat 12

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

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));
Run Code Online (Sandbox Code Playgroud)

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

QPushButton * but = new QPushButton(this);

QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, but);
Run Code Online (Sandbox Code Playgroud)

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


Goo*_*gie 9

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

如何QSignalMapper工作:

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

将映射器信号连接到SLOT,您将实现:

connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int)));
Run Code Online (Sandbox Code Playgroud)

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

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

mapper->setMapping(checkBox, integerValueForThisCheckbox);
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map()));
Run Code Online (Sandbox Code Playgroud)

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

而不是整数,你可以分配QString,QWidget*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;
}
Run Code Online (Sandbox Code Playgroud)

sender()函数来自QObject您继承的函数,因此您可以访问它.

  • int linge(这是一个行号,对吧?) -当你创建复选框,可以存储指针到复选框中的QList类字段,然后从你的槽函数使用它找出哪一行呢,这样的:

在课堂申报中:

private:
    QList<QCheckBox*> checkboxes;
Run Code Online (Sandbox Code Playgroud)

创建复选框时:

QCheckBox* cb = new QCheckBox();
checkboxes << cb;
Run Code Online (Sandbox Code Playgroud)

在你的插槽功能:

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

    int linge = checkboxes.indexOf(pCheckBox);
}
Run Code Online (Sandbox Code Playgroud)

如果需要,可以跳过它QList并使用QSignalMappermapper将行分配给复选框.这只是你喜欢的问题.