qt中connect报错


#include "QtWidgetsApplication3.h"
#include<QButtonGroup>
QtWidgetsApplication3::QtWidgetsApplication3(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::QtWidgetsApplication3Class())
{
    ui->setupUi(this);
    iniUI();
}

QtWidgetsApplication3::~QtWidgetsApplication3()
{
    delete ui;
}
 void QtWidgetsApplication3::iniUI()
{
    auto buttonGroup = new QButtonGroup(this);
     auto btnList = findChildren<QPushButton*>();
     for (auto btn : btnList)
     {
         buttonGroup->addButton(btn);
     }
     connect(buttonGroup, &QButtonGroup::buttonClicked,this, &QtWidgetsApplication3::onButtonGroupClicked);

}
void onButtonGroupClicked(QAbstractButton* btn)
{
    qInfo() << btn->text();
    QString name = btn->text();
    if (name >= "0" && name <= "9")
    {
        ui->lineEdit->insert(name);
    }
}


由于QButtonGroup::buttonClicked有多个重载版本,无法直接使用新的信号与槽语法进行连接,可以使用QOverload宏,显式地指定连接的函数重载,避免了重载函数的歧义问题。

connect(buttonGroup, QOverload<QAbstractButton*>::of(&QButtonGroup::buttonClicked), this, &QtWidgetsApplication3::onButtonGroupClicked);

img

所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。

该回答引用ChatGPT-3.5,仅为您提供参考,不保证完全正确
在你的代码中,有一个问题是你忘记了使用 this-> 或者 ui-> 来访问成员变量 uilineEdit。此外,还需要将 onButtonGroupClicked 函数声明为 QtWidgetsApplication3 类的成员函数,而不是一个全局函数。


以下是修复后的代码:

#include "QtWidgetsApplication3.h"
#include <QButtonGroup>
#include <QPushButton>

QtWidgetsApplication3::QtWidgetsApplication3(QWidget *parent)
    : QWidget(parent), ui(new Ui::QtWidgetsApplication3Class())
{
    ui->setupUi(this);
    iniUI();
}

QtWidgetsApplication3::~QtWidgetsApplication3()
{
    delete ui;
}

void QtWidgetsApplication3::iniUI()
{
    auto buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();
    for (auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }
    connect(buttonGroup, &QButtonGroup::buttonClicked, this, &QtWidgetsApplication3::onButtonGroupClicked);
}

void QtWidgetsApplication3::onButtonGroupClicked(QAbstractButton* btn)
{
    qInfo() << btn->text();
    QString name = btn->text();
    if (name >= "0" && name <= "9")
    {
        ui->lineEdit->insert(name);
    }
}

这个修复包括以下几点改进:

  1. QtWidgetsApplication3::onButtonGroupClicked 函数中,使用 this->ui->lineEdit 来访问 ui 成员变量的 lineEdit
  2. onButtonGroupClicked 函数声明为 QtWidgetsApplication3 类的成员函数。
  3. 修复了包含 <QPushButton> 头文件的问题,以确保 QPushButton 类型的按钮能够正确使用。

该回答引用NewBing,仅为您提供参考,不保证完全正确
根据我找到的一些网页¹²³⁴,Qt中的connect函数可能会报错的原因有以下几种:

  • connect函数的参数不匹配,例如信号和槽的参数类型或个数不一致,或者信号和槽的对象指针为空或无效。
  • connect函数的语法错误,例如忘记加括号、分号、引号等符号,或者使用了错误的宏定义。
  • connect函数的调用时机不合适,例如在构造函数中调用connect时,对象的元数据还没有完全初始化,导致connect失败。这种情况下,可以将connect放在一个单独的初始化函数中,并在构造函数之后调用。
  • connect函数的名称冲突,例如在使用socket编程时,也有一个名为connect的函数,和Qt中的connect函数产生了歧义。这种情况下,可以使用命名空间来区分不同的connect函数,例如使用::connect来表示socket编程中的connect函数。

根据您提供的代码片段,我发现您可能存在以下几个问题:

  • 您没有在类声明中将onButtonGroupClicked函数定义为槽函数,而是将其作为普通成员函数。这样会导致connect无法识别该函数为槽函数。您需要在类声明中添加public slots或者private slots,并将onButtonGroupClicked函数放在其中。
  • 您没有在onButtonGroupClicked函数的定义前加上类名和作用域符号,例如void QtWidgetsApplication3::onButtonGroupClicked(QAbstractButton* btn)。这样会导致编译器无法找到该函数的定义。您需要在onButtonGroupClicked函数的定义前加上类名和作用域符号。
  • 您没有在onButtonGroupClicked函数中使用ui指针来访问lineEdit对象,而是直接使用了lineEdit。这样会导致编译器无法找到lineEdit对象。您需要在onButtonGroupClicked函数中使用ui指针来访问lineEdit对象,例如ui->lineEdit->insert(name)。

源: 与必应的对话, 2023/9/10
(1) connect - Qt - Connected but doesn't work - Stack Overflow. https://stackoverflow.com/questions/12404283/qt-connected-but-doesnt-work.
(2) c++ - Qt connect() usage - Stack Overflow. https://stackoverflow.com/questions/26808464/qt-connect-usage.
(3) 在QT中使用socket编程:解决connect函数名称冲突 - CSDN博客. https://blog.csdn.net/weixin_43997331/article/details/122592882.
(4) Qt信号和槽连接失败原因及解决办法 - CSDN博客. https://blog.csdn.net/sinat_21107433/article/details/80974620.


该回答引用文心一言,仅为您提供参考,不保证完全正确
首先,我注意到你在connect语句中使用的onButtonGroupClicked函数并没有在QtWidgetsApplication3类中声明为槽函数。在Qt中,要将一个函数作为槽函数使用,它必须是在类定义中的一个成员函数,或者是一个全局函数。


这里,你应该将onButtonGroupClicked函数声明为QtWidgetsApplication3类的一个成员函数。代码如下:

class QtWidgetsApplication3 : public QWidget
{
    Q_OBJECT

public:
    QtWidgetsApplication3(QWidget *parent = nullptr);
    ~QtWidgetsApplication3();

private slots:
    void onButtonGroupClicked(QAbstractButton* btn);

private:
    Ui::QtWidgetsApplication3Class *ui;
};

注意,我添加了Q_OBJECT宏,这是Qt的元对象系统的一部分,它可以提供诸如信号和槽的功能。此外,我还将onButtonGroupClicked函数放入了private slots部分,这表明它是一个槽函数。


然后,你可以在iniUI函数中连接信号和槽:

void QtWidgetsApplication3::iniUI()
{
    auto buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();
    for (auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }
    connect(buttonGroup, &QButtonGroup::buttonClicked, this, &QtWidgetsApplication3::onButtonGroupClicked);
}

现在,每次在按钮组中有按钮被点击时,onButtonGroupClicked函数就会被调用。


该回答引用讯飞星火,仅为您提供参考,不保证完全正确
这段代码中存在一些错误,我将为您纠正这些错误并解释原因。

  1. connect函数中,&QButtonGroup::butt btn->text();这一部分是错误的,应该是&QButtonGroup::buttonClicked
  2. connect函数的参数中,应该使用SIGNAL(buttonClicked(QAbstractButton*)),而不是直接写槽函数名。
  3. connect函数之后,需要添加一个分号。
  4. if语句之前,需要添加一个花括号。

以下是修改后的代码:

#include "QtWidgetsApplication3.h"
#include <QButtonGroup>

QtWidgetsApplication3::QtWidgetsApplication3(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::QtWidgetsApplication3Class())
{
    ui->setupUi(this);
    iniUI();
}

QtWidgetsApplication3::~QtWidgetsApplication3()
{
    delete ui;
}

void QtWidgetsApplication3::iniUI()
{
    auto buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();
    for (auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }
    connect(buttonGroup, &QButtonGroup::buttonClicked, this, [this](QAbstractButton* button){
        if (button->text().toInt() >= 0 && button->text().toInt() <= 9)
        {
            ui->lineEdit->insert(button->text());
        }
    });
}

这段代码的功能是将QPushButton添加到QButtonGroup中,然后连接QButtonGroupbuttonClicked信号到槽函数。当按钮被点击时,槽函数会检查按钮的文本是否为0-9之间的数字,如果是,则将文本插入到lineEdit中。

【以下回答由 GPT 生成】

问题原因:在槽函数onButtonGroupClicked的定义中缺少了类名QtWidgetsApplication3::

解决方案:在槽函数的定义中添加类名QtWidgetsApplication3::

修改后的代码如下:

#include "QtWidgetsApplication3.h"
#include <QButtonGroup>

QtWidgetsApplication3::QtWidgetsApplication3(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::QtWidgetsApplication3Class())
{
    ui->setupUi(this);
    initUI();
}

QtWidgetsApplication3::~QtWidgetsApplication3()
{
    delete ui;
}

void QtWidgetsApplication3::initUI()
{
    auto buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();

    for (auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }

    connect(buttonGroup, &QButtonGroup::buttonClicked, this, &QtWidgetsApplication3::onButtonGroupClicked);
}

void QtWidgetsApplication3::onButtonGroupClicked(QAbstractButton* btn)
{
    qDebug() << btn->text();
    QString name = btn->text();

    if (name >= "0" && name <= "9")
    {
        ui->lineEdit->insert(name);
    }
}

希望能解决你的问题,如果还有其他疑问,请随时追问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

是的,因为这个信号是有重载的,你需要用 QOverload 指定是哪一个重载
你可以看看这个第三部分
【Qt】信号槽的三种连接语法_Loup&卡普的博客-CSDN博客