В настоящее время я изучал 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)
fn
? Извините, если я что-то пропустил. Также обратите внимание, что вам действительно следует использовать новый синтаксис сигнала / слота, где это возможно. - person G.M.   schedule 13.03.2021