2

QMainWindow の QWidget を動的に変更したい。したがって、古いウィジェット (存在する場合) は削除され、新しいウィジェットが作成されてメイン ウィンドウに追加されます。ウィジェット (_visualization) は、メニュー バーと OSG シーン グラフを表示するウィジェットを含む QMainWindow そのものです。新しいウィジェットを呼び出さないとshow()、メニュー バーのみが表示され、シーン グラフは表示されません。

私の目標はshow()、ユーザーがボタンをクリックしたときに を呼び出すことです。ボタンは、外側の QMainWindow (MyQMainWindow) に接続されています。

残念ながら、show()接続されたメソッドで _visualization を呼び出すと、シーン グラフが表示されません。それとは対照的に、コンストラクター メソッドで呼び出すと、シーン グラフが表示されます ( loadVisualization(...))。

MyQMainWindow::MyQMainWindow(QWidget *parent ) :
    QMainWindow(parent) {
    ...
    loadVisualization(...);
    connect(_ui->nextButton, SIGNAL(clicked()), this, SLOT(showNext()));
    ...
}

void MyQMainWindow::loadVisualization(QString filePath) {
    if (_visualization) {
        _heightWidgetLayout->removeWidget(_visualization);
        delete _visualization;
    }

    _visualization= new HeightVisualization(0, filePath);
    _visualization->setParent(_mainWindowWidget);
    _heightWidgetLayout->addWidget(_visualization);

    //_visualization->show();     // will work here
} 

void MyQMainWindow::showNext() {
    _visualization->show();       // does not work here!
}

QT がsetVisible(...)ウィジェットを呼び出すことはわかっています。このメソッドは、最初に QT のいくつかの状態をテストします ( testAttribute(Qt::WA_WState_ExplicitShowHide) && !testAttribute(Qt::WA_WState_Hidden))。で show() を呼び出すとshowNext()、これらのテストは何も変更せずに戻ります。

コネクタとスロットに問題がありますか? ユーザーがボタンをクリックしたときにウィジェットを表示する可能性はありますか?

4

1 に答える 1

0

私が学んだことは、stackedWidget を使用するのは簡単だということです。

その後、これを使用してプログラムで変更できます

currentPageIndex = (currentPageIndex + 1) % 3;
ui->stackedWidget->setCurrentIndex(0);

3 は、スタック ウィジェットにある合計ページ数になります。currentPageIndex を使用するか、0 で行ったように、ページ ID を使用していくつかの定数を作成することができます。

于 2014-10-04T03:44:54.817 に答える