1

我有一个非常具体的问题,所以我会尽量说清楚。

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

我的标签

如您所见,当我创建一行时,我qCheckBox在末尾添加了一个。我现在的目标是,当我单击(并在我取消选中 时删除此行)时,将此行发送到QTableWidget我的最后一个选项卡中。QtableTabqCheckBoxqCheckBox

所以每次我动态创建一条线时,我都会尝试关联到我qCheckBox的 a 信号:

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

但它不起作用,我得到了错误:

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

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

void supervision::cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

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

谢谢你。

[编辑]:这是我的函数创建qCheckBox并动态关联它的代码:

void supervision::ajouterCheckBox(QTableWidget *monTab, int ligne){
    // Creation de la check box
    QWidget *pWidget = new QWidget(); //Creation du widget contenant la checkbox
    QCheckBox *pCheckBox = new QCheckBox(); // Creation de la checkbox
    QHBoxLayout *pLayout = new QHBoxLayout(pWidget); // Layout pour centrer ma checkbox
    pLayout->addWidget(pCheckBox); // Ajout de la check box au layout
    pLayout->setAlignment(Qt::AlignCenter); //Alignement
    pLayout->setContentsMargins(0,0,0,0);//Supression des bordure
    pWidget->setLayout(pLayout);//Mise en place du layout dans le widget
    monTab->setCellWidget(ligne,5,pWidget);//Mise en place du widget contenant la checkbox dans ça cellule

    //Mise en place de la connection
    QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)));
}
4

3 回答 3

1

事实上,你的连接有问题。

实际上,您正在将一个参数为零的信号连接到一个接受三个参数的插槽,但这是行不通的。

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

所以你必须想办法让你的签名匹配。

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

于 2014-06-17T07:28:22.187 回答
1

您正在连接SIGNAL(clicked())SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)无效。信号和槽的参数应该匹配。在这里,您无需为目标插槽提供任何参数。

正确的形式是:

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

并且clickedCheckBoxslot 应该可以访问您的小部件的指针:

void myClass::clickedCheckBox()
{
   ...
}
于 2014-06-17T07:29:22.240 回答
0

来自Qt 文档

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

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

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

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

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

于 2014-06-17T07:34:11.987 回答