需要Qt架构建议
Qt Architecture Advice Needed
i我有一个使用QGLWidget进行绘图的Qt应用程序(只是一个用于3D绘图等的视口...
应用程序中有两个主要类。
- 主窗口继承自QWidget,其中包含许多GUI小部件(菜单栏,工具栏,视口,树视图...等)
- 系统从GUI执行所有其他操作(数学,几何,IO,数据处理等),并保存具有可绘制组件的"场景"对象。此外,它还具有单例模式,可以为自己创建一个全局实例。
我正在使用Qt信号插槽机制在MainWindow和系统之间进行通信,实际上MainWindow有信号,系统有插槽。我的问题从这里开始,如何从系统到主窗口插槽发出信号?当我在系统对象中定义主窗口时,它给了我很多错误。主窗口中的正常系统引用不会给出错误。但是当我在 System.h 中包含 MainWindow 的头文件时,系统引用在 MainWindow 端给出错误"'系统':'左侧的符号必须是类型"。
基本上我的结构看起来像这样。
// MainWindow.h
#include "System.h"
class MainWindow : public QWidget
{
Q_OBJECT
public:
QToolBar* MyToolBar; // etc...
MainWindow()
{
ConnectSignals();
}
void ConnectSignals() { connect(my_action, SIGNAL(triggered()), System::GetInstance()->Actions, SLOT(action())); }
}
// System.h
#include "MainWindow.h" // if I wrote this, it gives me error in compile time.
class System
{
static bool m_instance;
static System* m_system;
// private constructor
System()
{
Actions = new MyActionList();
}
public:
MyActionList* Actions;
System* GetInstance()
{
if (!m_instance)
{
m_system = new System();
m_instance = true;
return m_system;
}
else { return m_system; }
}
}
// System.cpp
bool System::m_instance = false;
System* System::m_system = NULL;
当然动作有插槽动作()那么如何从系统访问主窗口呢?
您的方法中的问题是 MainWindow 和 System 之间的循环依赖关系 - MainWindow 包括系统,系统包括 MainWindow。
为了将信号从系统传递到主窗口,您需要使系统的MyActionList发出任何接收器(在您的情况下为MainWindow)都可以处理的信号。您绝对不需要将 MainWindow 内容包含在系统中 - 让您的后端(系统)独立于任何 GUI 组件。只需将系统封装到 MainWindow 类中,并将 MyActionList 信号连接到 MainWindow 插槽即可。你需要在你的主窗口中有这样的东西:
connect(my_action, SIGNAL(triggered()), System::GetInstance()->Actions, SLOT(action()));
connect(System::GetInstance()->Actions, SIGNAL(systemSignal()), this, SLOT(handleSystemSignal()));
其中systemSignal()
是从系统或其 MyActionList 组件发出的信号。
正如@vahancho所述,您应该在GUI和其他系统之间保持分离。执行此操作的另一种方法是引入委托对象来处理两者之间的通信。
此外,如果您按照问题中所示内联代码,那么这将增加循环依赖的可能性。将实现移动到.cpp文件中,并在可能的情况下使用前向声明,而不是在其他头文件中包含标头。这也具有加快编译速度的好处,您会在大型项目中注意到这一点。
- 如何构建Qt + cmake + QGLWidget
- 在Visual Studio 2017中构建Qt可执行文件
- 尝试使用 MSVC 从源代码构建 qt 创建器:无法打开包含文件:"stddef.h":没有这样的文件或目录
- 错误:无法构建 PhantomJS!构建Qt基地失败
- 如何在构建Qt应用程序时运行git命令
- 使用Visual Studio构建QT
- 如何使用MINGW-W64通过链接时间优化构建QT
- 使用Qt多媒体支持构建Qt
- 尝试在树莓派上构建Qt项目,为什么它会抛出有关qmake的错误
- MSVC 编译器在调试模式下构建 Qt 5.10 时崩溃
- 如何使用-REDUCE -RECATIONS构建QT
- 从MACOS上的源代码构建QT时错误
- 如何有效地构建QT应用程序
- 如何正确构建Qt插件
- 从源代码构建Qt 5.8 - 配置:未知命令行选项'-c++11'
- 尝试使用VC++编译器构建Qt应用程序:"type_traits":没有这样的文件或目录
- 如何使用Team Foundation Server 2017构建QT应用程序
- 使用Visual Studio 2013构建QT 5.2.1的静态版本
- 为嵌入式系统构建QT时错误
- 无法在Visual Studio 2005中构建Qt项目