将信号和插槽关联到qcheckbox动态创建

时间:2014-06-17 07:15:06

标签: c++ qt signals slot qcheckbox

我遇到了一个非常具体的问题,所以我会尽量保持清醒。

我有QTabWidget,其中包含QTableWidgetQTableWidget的每一行都是通过读取文件动态创建的。

myTab

正如您所看到的,当我创建一条线时,我会在末尾添加qCheckBox。我现在的目标是,当我点击QTableWidget时,将此行发送到我QtableTab的最后一个标签中的qCheckBox(并在我取消选中{{1时删除此行) }})。

因此,每当我动态创建一条线时,我都会尝试将qCheckBox信号关联起来:

qCheckBox

但是它不起作用,我有错误:

QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)));

但是这个插槽存在,我在我的头文件和我的cpp中声明它是这样的:

QObject::connect: No such slot supervision::cliqueCheckBox(monTab,ligne, pCheckBox)

我解决这个问题的方法是好的吗?如果是,如何正确地将信号与插槽相关联,如果不是,如何继续?

谢谢。

[编辑]:这是我的函数代码创建void supervision::cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox) 并动态关联它:

qCheckBox

3 个答案:

答案 0 :(得分:1)

事实上,您的连接中存在问题。

实际上,您将一个零参数的信号连接到一个带有三个参数的插槽,并且无法正常工作。

当您将信号连接到插槽时,签名必须匹配(或插槽必须占用较少的args),否则您将在运行时收到错误。实际上,在您的情况下,插槽需要信号不会发送的参数。

所以你必须找到一种让你的签名匹配的方法。

编辑:关于您添加的代码,不,您不能使用声明连接作为参数的作用域中存在的变量。 Slot的参数只能来自相关信号。

答案 1 :(得分:1)

您正在将SIGNAL(clicked())SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)联系起来,这是无效的。信号和插槽的参数应该匹配。在这里,您不为目标插槽提供任何参数。

正确的形式是:

QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(clickedCheckBox()));

clickedCheckBox插槽应该可以访问小部件的指针:

void myClass::clickedCheckBox()
{
   ...
}

答案 2 :(得分:0)

来自Qt documentation

所有包含信号或槽的类必须在声明的顶部提及Q_OBJECT。它们还必须(直接或间接)从QObject派生。

class X : public QObject 
{ 
    Q_OBJECT
    ...
};

您必须在类声明中声明插槽:

public slots:
    void cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox);

关于是否在SIGNAL()和SLOT()宏中包含参数的规则,如果参数具有默认值,则传递给SIGNAL()宏的签名的参数必须少于传递的签名。到SLOT()宏