Qt 错误解决:QMetaObject::connectSlotsByName: No matching signal for on_modeComboBox_currentIndexChanged(int)
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();
}
}
}
示例说明:
- 该代码示例中,
modeComboBox的currentIndexChanged信号发出的是一个int类型的值,表示当前选中项的索引。 - 我们修改了
modeChanged信号参数类型为int,并使用connect函数将它与on_modeComboBox_currentIndexChanged槽函数连接,确保信号和槽函数参数类型一致。
注意事项
- 确保
connectSlotsByName函数连接的信号和槽函数参数类型一致。 - 如果仍然无法解决问题,请检查信号和槽函数的名称是否拼写错误。
- 使用
connect函数代替connectSlotsByName可以更灵活地连接信号和槽函数,并更好地控制连接方式。
代码示例
代码示例完整代码已包含在内容中,请参考 userswidget.h 和 userswidget.cpp 文件中的代码。
希望这份文档能够帮助您解决 Qt 中 “QMetaObject::connectSlotsByName: No matching signal for on_modeComboBox_currentIndexChanged(int)” 错误。
原文地址: https://www.cveoy.top/t/topic/fBcI 著作权归作者所有。请勿转载和采集!