问题描述
我目前正在研究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 (将#修改为@)