首页 文章

按下按钮后显示QWidget

提问于
浏览
2

我想动态更改QMainWindow中的QWidget . 因此,将删除旧窗口小部件(如果存在),将构造一个新窗口小部件并将其添加到主窗口 . 小部件(_visualization)是一个QMainWindow本身,它包含一个菜单栏和一个显示OSG场景图的小部件 . 如果我不在新窗口小部件上调用 show() ,我只会看到菜单栏,但不会看到场景图 .

我的目标是在用户点击按钮时调用 show() . 该按钮与外部QMainWindow(MyQMainWindow)连接 .

不幸的是,当我在连接方法中对_visualization调用 show() 时,将不会显示场景图 . 与此相反,如果我在构造函数方法( 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) ) . 如果我在 showNext() 中调用show(),这些测试会导致返回而不做任何更改 .

连接器和插槽有问题吗?当用户点击按钮时,是否有可能显示小部件?

1 回答

  • 0

    我学到的是使用stackedWidget很容易 .

    然后,您可以使用它以编程方式更改它

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

    3可以是堆栈小部件中的总页数 . 您可以使用currentPageIndex,也可以使用页面ID创建一些常量,就像我使用0一样 .

相关问题