0

すべてのウィジェットを含む MainWindow クラスがあり、メイン ウィンドウ (MainWindow クラス) に配置されたすべてのウィジェットにアクセスする MyClass クラスがあります。これどうやってするの?私はこのようにしようとしています(以下のコード)-しかし、それは私にたくさんのエラーを与えます:

MyClass.h:4: error: 'Ui' has not been declared
MyClass.h:4: error: expected `)' before '*' token
MyClass.h:6: error: 'Ui' has not been declared
MyClass.h:6: error: ISO C++ forbids declaration of 'MainWindow' with no type
MyClass.h:6: error: expected ';' before '*' token

QtCreator によって作成されたこの MainWindow は、Qt Creator によって作成された標準的な GUI ウィンドウです。

// -=-=-=-=-=-=-=-=-=-=[ MyClass.h ]=-=-=-=-=-=-=-=-=-=-=-=-=-
#include "MainWindow.h"
class MyClass {
    public:
        MyClass( Ui::MainWindow *ui );
    private:
        Ui::MainWindow *ui;
};

// -=-=-=-=-=-=-=-=-=-=[ MyClass.cpp ]=-=-=-=-=-=-=-=-=-=-=-=-=-

#include "MyClass.h"

MyClass::MyClass( Ui::MainWindow *ui ){
    this->myUI = ui; // myUI is desclared as: Ui::MainWindow *myUI
}

// -=-=-=-=-=-=-=-=-=-=[ MainWindow.h ]=-=-=-=-=-=-=-=-=-=-=-=-=-
....
namespace Ui {
    class MainWindow;
}
class MainWindow : public QMainWindow {
    Q_OBJECT    
    private:
        Ui::MainWindow *ui; // this has done by Qt Creator
    public:
        MyClass *myClass;
}
// -=-=-=-=-=-=-=-=-=-=[ MainWindow.cpp ]=-=-=-=-=-=-=-=-=-=-=-=-=-
#include "MainWindow.h"
MainWindow::MainWindow( QWidget *parent ): QMainWindow( parent ), ui( new Ui::MainWindow ) {
    ui->setupUi( this );
    myClass = new MyClass( ui ); // my attempt
}

更新: 以下の beige のコメントに便利なコードがあります。それは正常に動作します。しかし、私の場合はそうではありません:( MainWindow.hからではなく、任意のクラスから MyClass を宣言しようとすると:

// -=-=-=-=-=-=-=-=-=-=[ MyGLWidget.h ]=-=-=-=-=-=-=-=-=-=-=-= -=-

#include "MyClass.h"
class MyGLWidget : public QGLWidget {
   Q_OBJECT
   public:
     MyClass *myClass;
}

それは動作しません:

myclass.h:9: error: 'Ui' has not been declared
myclass.h:9: error: expected `)' before '*' token
myclass.h:12: error: 'Ui' has not been declared
myclass.h:12: error: ISO C++ forbids declaration of 'MainWindow' with no type
myclass.h:12: error: expected ';' before '*' token

しかし、なぜ?MyClass.h で「ui_mainwindow.h」を宣言しています。

4

1 に答える 1

3

MyClass ヘッダーには、ユーザー インターフェイス コンパイラから生成されたヘッダー ファイルを含める必要があります。あなたの場合、それは ui_mainwindow.h と呼ばれます。MyClass のコンストラクターは、Ui::MainWindow パラメーターを受け取り、それをプライベート メンバー変数に保存します。

MainWindow のコンストラクターで、MyClass メンバー変数を MainWindow ui で初期化できます。

// -=-=-=-=-=-=-=-=-=-=[ myclass.h ]=-=-=-=-=-=-=-=-=-=-=-= -=-

#include <ui_mainwindow.h>

class MyClass
{
public:
    MyClass(Ui::MainWindow *ui);

private:
    Ui::MainWindow *myUi;
};

// -=-=-=-=-=-=-=-=-=-=[ myclass.cpp ]=-=-=-=-=-=-=-=-=-=-=-= -=-

MyClass::MyClass(Ui::MainWindow *ui)
{
    // Save the MainWindow-ui as private member of MyClass
    this->myUi = ui;
}

// -=-=-=-=-=-=-=-=-=-=[ MainWindow.h ]=-=-=-=-=-=-=-=-=-=-=-= -=-

#include <QMainWindow>
#include "myclass.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    MyClass *myClass; // myClass member dont't has to be public
};

// -=-=-=-=-=-=-=-=-=-=[ MainWindow.cpp ]=-=-=-=-=-=-=-=-=-=-=-= -=-

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // Initialize MyClass with the MainWindow-ui
    myClass = new MyClass(ui);
}

MainWindow::~MainWindow()
{
    delete myClass;
    delete ui;
}
于 2012-10-09T16:08:13.030 に答える