我的帖子发布后: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
如何运作吗?我真的不明白要联系的内容:(
答案 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)
。
您可以指定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;
}
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为复选框指定行。这只是你喜欢的问题。