2013-09-06 22 views
8

私はC++とQtが新しく、親クラスからウィジェットにアクセスしようとしています。C++関数から親ウィジェットにアクセスする

は、ここで私は別のクラスを持っている、と私はそのクラスに「UI」からウィジェットにアクセスしようとしています私のmainwindow.cpp

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

です。同様に:

DashBoard::DashBoard(MainWindow *parent) : QObject(parent) 
{ 
} 

void DashBoard::select() 
{ 
    parent->ui->menuSL->setCurrentIndex(0); 
} 

これは、方法とフィールドを解決できないというエラーが表示されます。しかし、コンストラクタにparent->ui->menuSL->setCurrentIndex(0);という行を置くと問題はありません。

誰かが間違いを指摘しますか?

+2

'DashBoard :: select()'関数でシグナルを送出し、 'menSL'オブジェクトの' setCurrentIndex(int) 'スロット、または' MainWindow'クラスの関数に接続する必要があります。 – thuga

+0

私はthugaに同意します。 DashBoardから信号を発信する方が良い方法です。 – drescherjm

+1

あなたの親の 'ui'に直接アクセスすることはお勧めしません。代わりに、あなたの子供から呼び出すことができる定義されたアクセサメソッドを持つインターフェースからあなたの親を派生させてください。コール例:dynamic_cast (parent()) - > SetMenu(0);または、信号/スロットの概念を使用します。 – bkausbk

答えて

2

選択メソッド内では、parentという名前の変数を使用しようとします。しかし、QObject::parent()メソッドが必要です。

さらに、親をQMainWindowにキャストする必要があります。

公開されている場合は、uiにしかアクセスできません。

あなたが望む操作をするMainWindowクラス内でメソッドを提供する必要があります。

+0

私は分かりませんが、親クラスの優先順位を上げていないという目的を捨てるクラスのクラスですか? – n611x007

3

コードから、DashBoardQObjectを継承していると推測できます。 QObjectのフィールドはQObjectへのポインタとして定義されていますので、DashBoardのメソッドの中でparent->ui->menuSL->setCurrentIndex(0);を呼び出すと、QObjectにはuiというメンバーがtrueでないと定義されていると仮定しています。

((MainWindow*)(parent()))->ui->menuSL->setCurrentIndex(0); 

か、この1:

parentはのオブジェクトへのポインタとして定義されているため、エラーが表示されないコンストラクタで
MainWindow* parent = qobject_cast<MainWindow*>(this->parent()); 
// check parent is not null 
parent->ui->menuSL->setCurrentIndex(0); 

ただ、親をこのようにキャスト

クラスMainWindowとし、QObjectのコンストラクタに渡します。

uiがパブリックにするとDashBoardのcppファイルの中(あなたの場合、おそらく"ui_mainwindow.h"中)のQt Designerを使用している場合、自動生成されたUIヘッダを含めることを忘れないでください。

注:私はあなたの質問に答えようとしていますが、あなたのやり方を見直すことをお勧めします。より一貫したOO設計で同じことを達成するにはいくつかの方法があります。

+0

これを生成する エラー:メンバ関数の無効な使用( '()'を忘れましたか?) – user2444217

+1

'ui'をpublicにして、DashBoard cppに' #include "ui_mainwindow.h" 'を含めます。 – mhcuervo

+2

'((MainWindow *)(parent())) - > ...'実際に動作します、ありがとう。 – TranslucentCloud

関連する問題