在我的帖子:Associate signal and slot to a qcheckbox create dynamically之后,我需要关联:
·单击函数cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)的qCheckBox时的信号clicked()
要做到这一点,我必须使用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是怎么工作的吗?我真的不知道该和什么联系起来:
发布于 2014-06-17 18:16:48
QSignalMapper类收集一组无参数信号,并使用与发送信号的对象相对应的整数、字符串或小部件参数重新发出它们。所以你可以有一个这样的:
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));对于每个按钮,您可以将clicked()信号连接到QSignalMapper的map()插槽,并使用setMapping添加映射,以便在从按钮发出clicked()信号时发出信号mapped(QWidget *):
QPushButton * but = new QPushButton(this);
QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, but);这样,无论何时单击按钮,都会发出包含小部件作为参数的映射器的mapped(QWidget *)信号。
发布于 2014-06-17 18:07:55
首先,我将向您解释QSignalMapper是如何工作的。然后我会向你解释为什么你不需要它。
QSignalMapper 的工作原理:
创建%s QSignalMapper。假设您想要为每个复选框分配一个整数值,因此每次单击任何复选框时,您都会得到一个分配了整数值的信号。
将映射器信号连接到您要实现的插槽:
connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int)));现在你可以写slot了,它将接受整数参数。每个复选框的参数都是不同的。
创建复选框时,对于每个复选框,您需要执行以下操作:
mapper->setMapping(checkBox, integerValueForThisCheckbox);
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map()));从现在开始,每次您单击复选框时,它都会向QSignalMapper发出clicked()信号,然后它会将其映射到指定的整数值,并发出mapped()信号。您已连接到该mapped()信号,因此将使用正确的整数值调用yourSlot(int)。
您可以指定QString、QWidget*或QObject*,而不是整数(参见Qt文档)。
这就是QSignalMapper的工作方式。
你不需要它:
QTableWidget *monTab是一个单独的对象,它不会改变。将其保留为类成员字段,并在您的slot function.QCheckBox *pCheckBox中使用它-您可以通过将sender()转换为QCheckBox*.来获取它
如下所示:
void supervision::yourSlot()
{
QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
if (!pCheckBox) // this is just a safety check
return;
}sender()函数来自QObject,您确实继承了它,因此您可以访问它。
创建复选框时,可以将指向该复选框的指针存储在QList类字段中,并在插槽函数中使用它来确定是哪一行,如下所示:
在类声明中:
private:
QList<QCheckBox*> checkboxes;创建复选框时:
QCheckBox* cb = new QCheckBox();
checkboxes << cb;在您的slot函数中:
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并使用映射器将行分配给复选框。这只是你喜欢什么的问题。
https://stackoverflow.com/questions/24260394
复制相似问题