【问题标题】:Associate signal and slot to a qcheckbox create dynamically将信号和槽关联到一个 qcheckbox 动态创建
【发布时间】:2014-06-17 07:15:06
【问题描述】:

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

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

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

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

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)));
}

【问题讨论】:

  • 什么是supervision?命名空间还是类?
  • 监督是一个类。
  • 当你连接插槽时,你能确认你在这个类的成员函数中吗?
  • 我在编辑中添加了我执行此操作的功能
  • @EvansBelloeil,有几种解决方案。但是连接的信号和槽的签名必须是合适的。 JBL 已经回答了。

标签: c++ qt signals slot qcheckbox


【解决方案1】:

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

正确的形式是:

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

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

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

【讨论】:

  • 我需要参数,怎么办?
  • 您应该有指向您的小部件的指针作为类成员。然后你可以在类的任何位置访问它们。
  • 我加了很多qCheckBox,所以是很多指针。是否可以使用 3 个参数创建我自己的信号?
  • 在这种情况下,您可能需要 QSignalMapper 将小部件的无参数信号映射到带有一些参数的插槽。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 所以我删除了这个参数或者我把它添加到我的信号中(这迫使我创建一个信号?)?
  • 您有多种选择。您可以创建一个带有 0 个参数的插槽,连接到 clicked,它可以找到一种使用正确参数调用正确函数的方法。您可能会在 Qt 的关于 **advanced signals and slots mapping 的文档中找到帮助。
【解决方案3】:

来自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() 宏

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多