Qt代码错误:'QMetaObject::connectSlotsByName: No matching signal for on_modeComboBox_currentIndexChanged(int)' 解决方法

在使用Qt开发过程中,你可能会遇到如下错误信息:

QMetaObject::connectSlotsByName: No matching signal for on_modeComboBox_currentIndexChanged(int)

错误原因

这个错误通常是由于在使用 QMetaObject::connectSlotsByName() 函数自动连接信号和槽时,槽函数的命名不规范导致的。QMetaObject::connectSlotsByName() 函数会根据对象的objectName和信号/槽函数的名称进行匹配,如果槽函数的名称不符合规范,就会导致连接失败,并出现上述错误信息。

解决方法

  1. 检查槽函数名称: 确保槽函数的名称与信号的名称相匹配,并且命名规范正确。 - 槽函数的名称应该以 on_ 开头,后面跟着发送信号的控件的 objectName 和信号名称。 - 例如,如果信号是 modeComboBoxcurrentIndexChanged(int) 信号,那么槽函数的名称应该是 on_modeComboBox_currentIndexChanged(int)

  2. 手动连接信号和槽: 如果自动连接失败,你可以手动使用 connect() 函数连接信号和槽。

代码示例:

以下是修改后的代码,其中槽函数的名称已经修正,并且使用 connect() 函数手动连接了信号和槽:cpp#ifndef USERSWIDGET_H#define USERSWIDGET_H

#include

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 index); // 修正槽函数名称

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

#endif // USERSWIDGET_H

#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 #include #include

UsersWidget::UsersWidget(int userid,QWidget *parent) : QWidget(parent), ui(new Ui::UsersWidget){ 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->modeComboBox, QOverload::of(&QComboBox::currentIndexChanged), 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(); } }}

通过以上修改,你应该能够解决 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/fBcW 著作权归作者所有。请勿转载和采集!

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