Отправить клиентскую функцию-член в макрос 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: указатель на ошибку функции-члена но когда я попытался использовать этот метод, программа была создана, но при запуске выдает ошибку:

No such slot MainMenu::callSlot(fn)

person Gavluck Andrey    schedule 13.03.2021    source источник
comment
Что такое fn? Извините, если я что-то пропустил. Также обратите внимание, что вам действительно следует использовать новый синтаксис сигнала / слота, где это возможно.   -  person G.M.    schedule 13.03.2021
comment
fn - указатель на функцию-член   -  person Gavluck Andrey    schedule 13.03.2021
comment
Если вы хотите использовать указатели на функции-члены, вы должны (насколько мне известно) использовать новый синтаксис сигнала / слота. См. Также эту ссылку.   -  person G.M.    schedule 13.03.2021