0

描画にQGLWidgetを使用するQtアプリケーションがあります(単に3D描画用のビューポートなど...)

アプリケーションには 2 つの主要なクラスがあります。

  • MainWindow 多くの GUI ウィジェット (メニューバー、ツールバー、ビューポート、ツリービューなど) を保持する QWidget から継承します。
  • システムは、GUI から他のすべての操作 (数学、ジオメトリ、IO、データ処理など) を実行し、描画可能なコンポーネントを持つ「シーン」オブジェクトを保持します。

私はQtシグナルスロットメカニズムを使用してMainWindowとSystemの間で通信しています。実際にはMainWindowにはシグナルがあり、Systemにはスロットがあります。私の問題はここから始まります。System から MainWindow スロットに信号を送るにはどうすればよいですか? System object で MainWindow を定義すると、多くのエラーが発生します。通常、MainWindow でのシステム参照はエラーになりません。しかし、System.h に MainWindow のヘッダー ファイルをインクルードすると、System 参照によって、MainWindow 側で "'System': The symbol to the left of a '::' must be a type" というエラーが発生します。

基本的に私の構造はこのようになっています。

// 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;

もちろん、Actions にはスロット action() があります。では、System から MainWindow にアクセスするにはどうすればよいでしょうか。

4

2 に答える 2