我遇到了一个非常具体的问题,所以我会尽量保持清醒。
我有QTabWidget
,其中包含QTableWidget
,QTableWidget
的每一行都是通过读取文件动态创建的。
正如您所看到的,当我创建一条线时,我会在末尾添加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
答案 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)
所有包含信号或槽的类必须在声明的顶部提及Q_OBJECT。它们还必须(直接或间接)从QObject派生。
class X : public QObject
{
Q_OBJECT
...
};
您必须在类声明中声明插槽:
public slots:
void cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox);
关于是否在SIGNAL()和SLOT()宏中包含参数的规则,如果参数具有默认值,则传递给SIGNAL()宏的签名的参数必须少于传递的签名。到SLOT()宏