Qt 错误解决:QMetaObject::connectSlotsByName: No matching signal for on_modeComboBox_currentIndexChanged(int)

该错误通常发生在使用 connectSlotsByName 函数连接信号和槽函数时,由于信号参数类型与槽函数参数类型不一致导致。

错误原因分析

  • 错误信息表明在使用 connectSlotsByName 连接信号和槽函数时,系统无法找到与 on_modeComboBox_currentIndexChanged(int) 槽函数匹配的信号。
  • on_modeComboBox_currentIndexChanged(int) 槽函数的参数类型是 int,而 modeComboBox 发出的 currentIndexChanged 信号参数类型是 QString

解决方法

  • 修改信号参数类型userswidget.h 文件中,将 modeChanged 信号参数类型改为 int
#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(int mode); // 修改信号参数类型为int

private slots:
    void on_modeComboBox_currentIndexChanged(int index);

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

#endif // USERSWIDGET_H
  • 连接信号与槽函数userswidget.cpp 文件中,使用 connect 函数将 modeChanged 信号与 on_modeComboBox_currentIndexChanged 槽函数连接。
#include "userswidget.h"
#include "ui_userswidget.h"
#include "sqlite.h"
#include "lights.h"
#include "aircondition.h"
#include "curtains.h"
#include "humidiffer.h"
#include "information.h"
#include "procession.h"
#include <QCloseEvent>
#include <QMessageBox>

UsersWidget::UsersWidget(int userid, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::UsersWidget),
    userid(userid) // 初始化成员变量userid
{
    ui->setupUi(this);
    displayUsersWidget();
    connect(ui->lights,&QToolButton::clicked,this,[=]{
        Lights *w = new Lights(userid);
        w->show();});
    connect(ui->air_condition,&QToolButton::clicked,this,[=]{
        AirCondition *w = new AirCondition(userid);
        w->show();});
    connect(ui->curtains,&QToolButton::clicked,this,[=]{
        Curtains *w = new Curtains(userid);
        w->show();});
    connect(ui->humidifiers,&QToolButton::clicked,this,[=]{
        Humidiffer *w = new Humidiffer(userid);
        w->show();});
    connect(ui->tables,&QToolButton::clicked,this,[=]{
        Information *w = new Information;
        w->show();});
    connect(ui->wifi,&QToolButton::clicked,this,[=]{
        Procession *w = new Procession;
        w->show();});
    connect(ui->mode, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &UsersWidget::on_modeComboBox_currentIndexChanged);

    // 连接modeChanged信号与on_modeComboBox_currentIndexChanged槽函数
    connect(this, &UsersWidget::modeChanged, this, &UsersWidget::on_modeComboBox_currentIndexChanged);
}

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

void UsersWidget::displayUsersWidget()
{
    setWindowTitle('智能家居总览图');
    setFixedSize(900,600);

}

void UsersWidget::on_modeComboBox_currentIndexChanged(int mode)
{
    switch (mode)
    {
        case 1:
        {
        updateSmartHomeStatus(userid, '智能灯', '开启', '20');
        updateSmartHomeStatus(userid, '空调', '开启', '27');
        updateSmartHomeStatus(userid, '加湿器', '开启', '50');
        updateSmartHomeStatus(userid, '窗帘', '开启', '100');
        break;
        }
        case 2:
        {
        updateSmartHomeStatus(userid, '智能灯', '开启', '20');
        updateSmartHomeStatus(userid, '空调', '开启', '27');
        updateSmartHomeStatus(userid, '加湿器', '开启', '50');
        updateSmartHomeStatus(userid, '窗帘', '开启', '100');
        break;
        }
        case 3:
        {
        updateSmartHomeStatus(userid, '智能灯', '开启', '50');
        updateSmartHomeStatus(userid, '空调', '开启', '26');
        updateSmartHomeStatus(userid, '加湿器', '开启', '40');
        updateSmartHomeStatus(userid, '窗帘', '开启', '30');
        break;
        }
        default:;  
    }
}

void UsersWidget::closeEvent(QCloseEvent *e)
{
    if(e->spontaneous())
    {
        //窗口关闭时弹出的提示窗口
        QMessageBox::StandardButton reply;
        reply = QMessageBox::information(this,'提示','确认退出智能管家系统?',QMessageBox::Yes|QMessageBox::No);
        if(reply == QMessageBox::Yes){
            //若用户点击确认,则接收这个事件,当前窗口会关闭
            e->accept();
         }else{
            //若用户点击取消,则忽略这个事件,当前窗口不会关闭
            e->ignore();
        }
    }
}

示例说明:

  • 该代码示例中,modeComboBoxcurrentIndexChanged 信号发出的是一个 int 类型的值,表示当前选中项的索引。
  • 我们修改了 modeChanged 信号参数类型为 int,并使用 connect 函数将它与 on_modeComboBox_currentIndexChanged 槽函数连接,确保信号和槽函数参数类型一致。

注意事项

  • 确保 connectSlotsByName 函数连接的信号和槽函数参数类型一致。
  • 如果仍然无法解决问题,请检查信号和槽函数的名称是否拼写错误。
  • 使用 connect 函数代替 connectSlotsByName 可以更灵活地连接信号和槽函数,并更好地控制连接方式。

代码示例

代码示例完整代码已包含在内容中,请参考 userswidget.huserswidget.cpp 文件中的代码。

希望这份文档能够帮助您解决 Qt 中 “QMetaObject::connectSlotsByName: No matching signal for on_modeComboBox_currentIndexChanged(int)” 错误。

Qt 错误解决:QMetaObject::connectSlotsByName: No matching signal for on_modeComboBox_currentIndexChanged(int)

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

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