2016-04-04 7 views
2

私はQt 5.5.1を使用しています。私はコードで手動で作成されたMainWindowを持っています。それはQListWidgetQStackedWidgetを持っています。また、フォームデザインで作られた*.uiファイルを持つ5つのウィジェットを持っています。問題はフォームのオブジェクトのフィールドをMainWindow.cppに設定する方法がわからないことです。 多くのウィジェットを持つUIオブジェクトを設定する

#include <QWidget> 

namespace Ui 
{ 
    class settings; 
    class textCreating; 
    class databasework; 
    class AutoMode; 
    class ManualMode; 
} 

class settings : public QWidget 
{ 
    Q_OBJECT 
public: 
    settings(QWidget *parent = 0); 
    ~settings(); 
    static Ui::settings *ui; //It was private and not static at first 
private: 
}; 

//other classes// 
//...// 

そしてpages.cppで

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

そしてMainWindow.cpp:ここ

はpages.hの最初の行です

MainWindow::MainWindow() 
{ 
    //code here// 

    settings::ui->firstAddedParamLabel->setVisible(true); 
} 

だから、ときに私コンパイル、私は得る:

error: 'Ui::settings* settings::ui' is a static data member; it can only be initialized at its definition settings::settings(QWidget *parent) : QWidget(parent), ui(new Ui::settings)

ui(new Ui::settings)を指します。私の質問は、UIフィールドを設定/取得する方法ですか?私は完全に理解できません。ありがとう!

+1

これを公開して静的にしたいのですが、同じことを達成する別の方法があるかもしれません。 – Apin

+0

たとえば、MainWindowでプライベートメンバーUi :: settingsを使用できませんでした。だから公開しました。その後、私は静的メンバーUi :: settingsを設定することができないというエラーが表示されます。 –

+0

なぜ 'MainWindow'から' Ui :: settings'を操作しようとしていますか? – thuga

答えて

2

"ui"メンバーは静的であってはいけません。どのような理由でそれをすることに決めましたか?あなたは、単純な自分のメイン・ウィンドウクラスのメンバーとして追加することができ、

#include <QWidget>  
#include "ui_settings.h" 

class settings : public QWidget 
{ 
    Q_OBJECT 

public: 
    settings(QWidget* parent) : QWidget(parent) 
    {// move this to cpp... 
    ui.setupUi(this); 
    } 
    virtual ~settings(); 

public: 
    Ui::settings ui; 
}; 

そして、それを使用する:あなたも同じように、単純なクラススコープメンバーとしてそれを使用することができます。

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    MainWindow(QWidget* parent) 
    { 
    _settings = new settings(this); 
    setCentralWidget(_settings); // You may also add it somewhere else in your layout, of course. 

    _settings->ui.firstAddedParamLabel->setVisible(true); 
    } 

private: 
    settings* _settings; 
}; 

個人的に、私はpublicとして全体Ui::settingsクラスを公開することは非常に美しいとは思いません。また、クリーンなコードスタイルを維持し、正しくキャメルケース型のより堅牢なクラス名を使用することをお勧めします。

例えば:=>SettingsWidget と生成されたUIクラス多分用settingsui::settings =>Ui::SettingsWidgetForm

これは、それが簡単に生成され、自己記述されたクラス間の差を保つことができます。

+0

私はエラーがあるので、私はそれをしました:非静的なデータメンバ 'settings :: ui'の無効な使用Ui :: settings * ui; –

+0

MainWindowの使い方についての私の更新を見てください:-) – mfreiholz

+0

私はそれが正しいかどうかわかりません...クラスのコンストラクタをヘッダに移動する必要がありますか?そして、すべてのメインウィンドウのメンバーをコンストラクタに設定しますか?私の脳は痛い...また、私はmain.cppでそれを使用します。 QObject * saveConfig = sets.findChild ( "saveSetupsButton"); –

0

あなたが本当にそれを静的にしたい場合は、あなたが以下試すことができます。

をごpage.cppで:

Ui::settings *settings::ui = 0; 
settings::settings(QWidget *parent) : QWidget(parent), ui(new Ui::settings) 
{ 
    ui->setupUi(this); 
} 

あるいは、上記のコードは動作しない場合は、以下試してください。

Ui::settings *settings::ui = new Ui::settings; 
settings::settings(QWidget *parent) : QWidget(parent) 
{ 
    ui->setupUi(this); 
} 

私の質問はまだ静的にしたいのですか?あなたは実際に何をしたいですか? UIを操作する場合は、設定ウィジェット内で行う必要がありますが、これは良い方法ではありません。あなたのUIに何か間違っているものが見つかった場合、それを操作することができるため、見つけにくいです。

関連する問題