我想动态更改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(),这些测试会导致返回而不做任何更改。
连接器和插槽有问题吗?当用户点击按钮时,是否有可能显示小部件?
答案 0 :(得分:0)
我学到的是使用stackedWidget很容易。
然后,您可以使用此
以编程方式更改它currentPageIndex = (currentPageIndex + 1) % 3;
ui->stackedWidget->setCurrentIndex(0);
3可以是堆栈小部件中的总页数。您可以使用currentPageIndex,也可以使用页面ID创建一些常量,就像我使用0一样。