【发布时间】:2019-04-21 16:39:39
【问题描述】:
我正在用 QT 编写一个程序,目前有一个GameEngine(数据处理)类和一个MainWindow(GUI)类。
GameEngine 和 MainWindow 类的单个实例都归 int main 函数所有。
MainWindow 实例有一个User Action 按钮,它将打开一个名为Dialog_UserAction 的QDialog 类的实例。此 QDialog 的实例归 MainWindow 所有,它也是 QDialog 的父级(在 Dialog_UserAction 实例打开时禁用 MainWindow GUI)。
我的问题是 QDialog 和 GameEngine 实例之间需要连接许多事件(信号)。
有什么简单的方法可以实现吗?
我已经尝试通过MainBoard 将信号从Dialog_UserAction 转发到GameEngine,反之亦然。这可行,但对于这项任务来说,这是一个相当混乱的解决方案。
我也尝试让Dialog_UserAction 归Main 所有,但我不知道如何在主要上下文中对User Action Button clicked-事件作出反应。
最后,我还尝试让GameEngine 实例拥有Dialog_UserAction,这是一个简单的解决方案(除了MainBoard GUI 不会被禁用,而Dialog_UserAction 是打开的)。但是,我真的希望所有与 GUI 相关的实例都被排除在 GameEngine 上下文之外。
GameEngine.h:
class GameEngine : public QObject
{
Q_OBJECT
signals:
void someSignalToDialog(void);
public slots:
void on_someSignalFromDialog();
}
Dialog_UserAction.h:
class Dialog_UserAction: public QObject
{
Q_OBJECT
signals:
void someSignalToGameEngine(void);
public slots:
void on_someSignalFromGameEngine();
}
Main.cpp:
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QApplication::setWindowIcon(QIcon(":/images/MageKnightLogo.jpg"));
GameEngine gameEngine;
Window_MainBoard mainBoard;
mainBoard.showFullScreen();
return a.exec();
}
主板.cpp:
#include "Dialog_UserAction.h"
...
void Window_MainBoard::on_pushButton_enterUserAction_clicked() {
Dialog_UserAction actionDialog(this);
// connect signals and slots here?
if (actionDialog.exec() == QDialog::Accepted)
{
// Send signal with data to GameEngine
}
}
...
所以,我真正要问的是:
有什么简单的方法可以在此设置中设置信号槽连接,我可以将Dialog_UserAction 与GameEngine 连接起来,而无需在MainBoard 上下文中转发信号?
如果没有,您对我如何以更好的方式解决这个问题有什么建议吗?提前致谢。
【问题讨论】:
-
听起来你真的不希望游戏引擎担心对话框的存在。因此,只需将您需要的信号放入主窗口,然后将它们连接到游戏引擎一次。然后在创建对话框时,将其信号连接到主窗口的信号。为此编写辅助函数将有助于您的代码保持可读性。我真的不明白你对这种方法的问题是什么。