Qt中QObject::connect信号槽参数传递报错求助
Qt信号槽连接报错问题
我在使用QObject::connect连接信号与槽时遇到两个错误:
Call to non-static member function without an object argument
Cannot take the address of an rvalue of type 'void'
第一个错误指向&BoardScreen::boardScreenClosed(),第二个错误指向&StartScreen::on_boardScreenClosed(),二者均出现在connect()函数的参数中。我查阅了Qt官方文档及诸多教程、论坛,仍未发现我的代码与示例代码的差异。
相关代码如下:
boardscreen.h
#ifndef BOARDSCREEN_H #define BOARDSCREEN_H #include <QMainWindow> namespace Ui { class BoardScreen; } class BoardScreen : public QMainWindow { Q_OBJECT public: explicit BoardScreen(QWidget *parent = nullptr); ~BoardScreen(); signals: void boardScreenClosed(); private: Ui::BoardScreen *ui; QWidget *parentForm;; }; #endif // BOARDSCREEN_H
startscreen.h
#ifndef STARTSCREEN_H #define STARTSCREEN_H #include <QMainWindow> #include <QLabel> #include <QObject> #include "boardscreen.h" #include "playscreen.h" namespace Ui { class StartScreen; } class StartScreen : public QMainWindow { Q_OBJECT public: explicit StartScreen(QWidget *parent = nullptr); ~StartScreen(); private slots: void on_btn_play_clicked(); // Open the board screen void on_boardScreenClosed(); private: Ui::StartScreen *ui; PlayScreen *playScreen; }; #endif // STARTSCREEN_H
startscreen.cpp
#include "startscreen.h" #include "ui_startscreen.h" #include "boardscreen.h" StartScreen::StartScreen(QWidget *parent) : QMainWindow(parent), ui(new Ui::StartScreen) { ui->setupUi(this); setWindowTitle("chesster"); setGeometry(200, 85, 1500, 900); // Load logo QString path = R"(C:/user/path/to/logo.png)"; QPixmap img(path); ui->lbl_logo->setPixmap(img); this->show(); } StartScreen::~StartScreen() { delete ui; } void StartScreen::on_btn_play_clicked() { BoardScreen *boardScreen = new BoardScreen(this); boardScreen->show(); connect(boardScreen, &BoardScreen::boardScreenClosed(), this, &StartScreen::on_boardScreenClosed()); this->hide(); } void StartScreen::on_boardScreenClosed() { this->show(); }
问题解决
你犯了一个基础语法错误:在传递信号和槽的函数指针时,你额外加了括号(),这会让编译器认为你是在调用函数,而非获取函数的地址。
正确的connect写法需要去掉函数名后的括号:
connect(boardScreen, &BoardScreen::boardScreenClosed, this, &StartScreen::on_boardScreenClosed);
原因很简单:
&BoardScreen::boardScreenClosed是信号成员函数的指针,我们只需要把这个指针传递给connect,不需要调用它- 同理,
&StartScreen::on_boardScreenClosed是槽函数的指针,同样不需要加括号执行调用
修改后两个编译错误都会消失。
内容的提问来源于stack exchange,提问作者catfriendly
相关产品推荐
相关产品推荐

