Qt错误解决:'QMetaObject::connectSlotsByName: No matching signal'

在Qt开发中,我们经常使用信号与槽机制来实现对象之间的通信。然而,有时我们会遇到 'QMetaObject::connectSlotsByName: No matching signal' 的错误,这意味着Qt找不到与槽函数相匹配的信号。

本文将以 'on_modeComboBox_currentIndexChanged(int)' 信号为例,详细解析该错误的原因和解决方法。

错误原因:

出现此错误是因为槽函数的命名不符合Qt自动连接信号与槽的规则。Qt要求槽函数的命名必须以 'on_' 开头,后面跟着信号发送对象的名称(去掉 'ui->' 前缀)和信号名称,中间用下划线 '_' 连接。

在本例中,信号发送对象的名称应该是 'modeComboBox',信号名称是 'currentIndexChanged(int)',因此正确的槽函数名称应该是 'on_modeComboBox_currentIndexChanged(int)'。

解决方法:

  1. 检查槽函数名称: 确保槽函数的命名符合Qt的规则,即 'on_对象名_信号名(参数列表)'。
  2. 检查信号连接: 确保在 connect() 函数中,信号和槽函数的名称正确,并且参数类型匹配。

代码示例:

以下是修改后的代码,槽函数名称已更正:

#ifndef USERSWIDGET_H
#define USERSWIDGET_H

#include <QWidget>

namespace Ui {
class UsersWidget;
}

class UsersWidget : public QWidget
{
    Q_OBJECT

public:
    explicit UsersWidget(int userid,QWidget *parent = nullptr);
    ~UsersWidget();
    void displayUsersWidget();

protected:
    void closeEvent(QCloseEvent *);

signals:
    void modeChanged(const QString &mode); // 添加信号

private slots:
    void on_modeComboBox_currentIndexChanged(int mode); // 修改槽函数名称

private:
    Ui::UsersWidget *ui;
    int userid;
};

#endif // USERSWIDGET_H

// ... 其他代码 ...

UsersWidget::UsersWidget(int userid,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::UsersWidget)
{
    ui->setupUi(this);
    // ... 其他代码 ...
    connect(ui->mode, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &UsersWidget::on_modeComboBox_currentIndexChanged); // 修改信号连接部分
    // ... 其他代码 ...
}

// ... 其他代码 ...

void UsersWidget::on_modeComboBox_currentIndexChanged(int mode) // 修改槽函数名称
{
    // ... 处理currentIndexChanged信号的代码 ...
}

// ... 其他代码 ...

通过以上步骤,您就可以解决 'QMetaObject::connectSlotsByName: No matching signal' 错误,并成功连接信号与槽。请记住,正确的命名是Qt自动连接信号与槽的关键。

Qt错误解决:'QMetaObject::connectSlotsByName: No matching signal'

原文地址: https://www.cveoy.top/t/topic/fBdg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录