8

私は C++ と Qt が初めてで、親クラスからウィジェットにアクセスしようとしています。

これが私のmainwindow.cppです

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

別のクラスがあり、そのクラスの「ui」からウィジェットにアクセスしようとしています。そのようです:

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

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

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

誰かが私の間違いを指摘してくれませんか?

4

2 に答える 2

3

DashBoardコードから、クラスがを継承していると推測できQObjectます。aのparentフィールドは aQObjectへのポインターとして定義されているため、クラスのメソッド内でQObject呼び出すと、呼び出されたメンバーを定義していると想定されますが、これは true ではありません。parent->ui->menuSL->setCurrentIndex(0);DashBoardQObjectui

このように親をキャストするだけです:

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

またはこれ:

MainWindow* parent = qobject_cast<MainWindow*>(this->parent());
// check parent is not null
parent->ui->menuSL->setCurrentIndex(0);

parentコンストラクターでは、クラスのオブジェクトへのポインターとして定義され、のコンストラクターMainWindowに渡されるため、エラーは表示されませんQObject

cpp ファイルでuiQt Designer (この場合はおそらく"ui_mainwindow.h") を使用している場合は、公開し、自動生成された UI ヘッダーを含めることを忘れないでください。DashBoard

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

于 2013-09-06T04:31:16.150 に答える
2

select メソッド内で、 という名前の変数を使用しようとしていますparentQObject::parent()しかし、その方法が必要です。

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

void DashBoard::select(  ) {
  QMainWindow* parent = qobject_cast<QMainWindow>(this->parent());
  if (parent == 0) { return; } // or some other error handling
  parent->ui->menuSL->setCurrentIndex(0);
}

公開されている場合のみアクセスできますui

MainWindowまったく、必要な操作を行うクラス内のメソッドを提供する必要があると思います。

于 2013-09-06T04:21:26.217 に答える