You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:01:20