QT5 connect函数传入QMainWindow指针出现参数不匹配报错排查
问题根本原因
你报错的核心是Qt基于函数指针的connect语法对参数类型有严格匹配要求:
- 你在UI_handling类中存储的
mainWindow成员变量是QMainWindow*类型,属于基类指针 - 你绑定的槽
&MainWindow::update_looping_teriminal是派生类MainWindow的成员函数 - Qt的connect模板要求第三个参数(接收者指针)的类型必须和槽函数所属的类完全一致,基类指针不能隐式转换为派生类指针去匹配槽函数的所属类,所以编译期就匹配不到对应的connect重载。
你在MainWindow内部写connect时用的this是MainWindow*类型,和槽函数所属类完全匹配,所以不会报错。
解决方案
有两种常用修复方式:
方案1:修改UI_handling类的成员变量类型
直接把UI_handling里存储的mainWindow指针类型从QMainWindow*改成MainWindow*即可,步骤如下:
- 在UI_handling的头文件中提前声明
class MainWindow; - 将成员变量
QMainWindow* mainWindow;改为MainWindow* mainWindow; - 构造函数的参数也对应改成
MainWindow* mainWindow
代码示例:
// UI_handling.h 头部增加前置声明 class MainWindow; class UI_handling{ public: UI_handling(MainWindow* mainWindow, Ui::MainWindow* ui); // 其余代码不变 private: MainWindow* mainWindow; // 修改指针类型 // 其余代码不变 };
方案2:调用connect时做显式类型转换
如果不想改成员变量类型,也可以在调用connect时把基类指针显式转为MainWindow*:
mainWindow->connect(loop_terminal_thread, &Loop_terminal_thread::send_ID_and_data_to_looping_terminal, qobject_cast<MainWindow*>(mainWindow), // 显式转换指针类型 &MainWindow::update_looping_teriminal);
注意用
qobject_cast比C风格强制转换更安全,Qt会在运行期检查类型是否匹配,转换失败会返回空指针。
内容的提问来源于stack exchange,提问作者euraad
相关产品推荐
相关产品推荐

