将客户端成员函数发送到 SLOT() 宏

问题描述

我目前正在研究QT,不得不面对将成员函数指针传递给SLOT宏的问题。以下是部分代码:

main.cpp:

#include <iostream>
#include <QApplication>
#include "vMainMenu.hpp"
     
int main(int argc,char *argv[]) {
    QApplication app(argc,argv);
    try{
        MainMenu* menu = new MainMenu{};
        menu->show();
    }
    catch(const std::exception& e)
        std::cerr << e.what() << '\n';
    return app.exec();
}

vMainMenu.hpp:

#pragma once
#include <QDialog>
#include <QtWidgets>
#include "vMainMenu.hpp"

class MainMenu : public QDialog
{
    Q_OBJECT

public:
    MainMenu(QWidget *parent = nullptr){
    m_Layout = new QVBoxLayout{};
        showMainMenu();
    };
    virtual ~MainMenu();

private slots:
    void showMainMenu(){
    addButton(tr("&One player"),&MainMenu::showOPMenu);
    addButton(tr("&Network"),&MainMenu::showNWMenu);
    setLayout(m_Layout);
    m_Layout->update();
    };
    void showOPMenu(){};
    void showNWMenu(){};

private:
    void addButton(const QString& str,void(MainMenu::*fn)()){
    QPushButton* btn = new QPushButton{str};
        // more button config ...
    m_Layout->addWidget(btn); 
        QObject::connect(btn,SIGNAL (clicked()),this,SLOT(fn)); // this metod doesn`t work
    }
    QVBoxLayout *m_Layout;
};

CMakeLists.txt:

    cmake_minimum_required(VERSION 3.8)
    project(proj)
     
    set(CMAKE_CXX_STANDARD 17)

    find_package(Qt5Core REQUIRED)
    find_package(Qt5Gui REQUIRED)
    find_package(Qt5Widgets REQUIRED)
     
    QT5_WRAP_CPP(MOC_Files vMainMenu.hpp)
    add_library(forms SHARED${MOC_Files})
    
    target_link_libraries(forms Qt5::Core)
    target_link_libraries(forms Qt5::Gui)
    target_link_libraries(forms Qt5::Widgets)

    set(SOURCE_FILES main.cpp)
    add_executable(proj ${SOURCE_FILES})
    
    target_link_libraries(proj forms)

是否有一种方法可以修改 addButton 函数以接收指向非静态成员函数的指针(或其他方式)并将其推送到 SLOT 宏。我试图将它作为参数发送。程序已经构建好了,但是运行的时候报错:

QObject::connect: Parentheses expected,slot MainMenu::fn ...

我知道它试图将 'fn' 解释为 MainMenu::fn,但是是否有一种方法或某种抽象的成员函数可以通过 SLOT 宏读取?

我已经阅读了这篇 QT SLOT: Pointer to Member Function error 帖子,但是当我尝试使用该方法时,程序已经构建,但是当它运行时,它会抛出一个错误:

No such slot MainMenu::callSlot(fn)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...