QMainWindow中setCentralWidget和takeCentralWidget组合使用
一、前言
QMainWindow是做Qt开发最熟悉的控件啦,最近在做一个项目是由于调用的是一个封装好的库而无法直接使用Qt设计师设计界面只能使用代码码布局。主界面只能默认一个布局,当需要另外一个布局时就需要把之前的布局隐藏掉。在只是用setVisible去控制的工程中,一直出现崩溃的问题。经过多次尝试,查找原因发现切换布局时需要把之前的布局拿掉才行。这时候就要用到QMainWindow提供的setCentralWidget()和takeCentralWidget()这两个函数组合使用就可以解决问题啦。
二、示例代码
在QMainWindow中使用setCentralWidget时,当出现主界面切换时,再次设置setCentralWidget时,需要先使用takeCentralWidget去掉原来的设置,才能再次使用setCentralWidget。
工程中用到的代码片段如下:
void MainWindow::initMainLayout()
{
m_pMonitorStatus = new MonitorStatus(this);
QHBoxLayout *pMonitorHLayout = new QHBoxLayout(this);
pMonitorHLayout->addWidget(m_pMonitorStatus);
m_pMonitorStatus->setVisible(false);
this->setLayout(pMonitorHLayout);
/*this->setCentralWidget(m_pMonitorStatus);*/ 初始化时只能设置一次,否则会出现崩溃错误,可以把你想显示的界面在初始化时使用setCentralWidget进行设置
QGroupBox *pTreeGroupBox = new QGroupBox(this);
pTreeGroupBox->setMaximumWidth(400);
m_pSplitter = new QSplitter(Qt::Horizontal);
QVBoxLayout *pVBoxLayout = new QVBoxLayout(this);
m_mapGroupBox = new QGroupBox("地图显示区域", this);
m_tree = new QTreeView();
m_tree->setMinimumWidth(200);
m_tree->setMaximumWidth(400);
m_tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_model = new QStandardItemModel(2, 1);
m_model->setHeaderData(0, Qt::Horizontal, "产品检验树");
showLWN_1c(); /// 默认显示产品检验树数据
m_pTreeCheckResult = new QTreeView();
m_pTreeCheckResult->setMinimumWidth(200);
m_pTreeCheckResult->setMaximumWidth(400);
m_pTreeCheckResult->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_pModelCheckResult = new QStandardItemModel(3, 1);
m_pModelCheckResult->setHeaderData(0, Qt::Horizontal, "检验结果树");
initCheckResultTree(); /// 默认显示检验结果树数据
pVBoxLayout->addWidget(m_tree);
pVBoxLayout->addWidget(m_pTreeCheckResult);
pTreeGroupBox->setLayout(pVBoxLayout);
m_pSplitter->addWidget(pTreeGroupBox);
m_pSplitter->addWidget(m_mapGroupBox);
m_pWidget = new QWidget(this);
QHBoxLayout* pLayout = new QHBoxLayout(m_pWidget);
pLayout->addWidget(m_pSplitter);
/// 绑定界面
this->setCentralWidget(m_pWidget);
//m_pWidget->setVisible(true);
}
void MainWindow::dealCurrentRibbonPage(RibbonPage* page)
{
QString pageText = page->title();
if (pageText == "监控状态" && !m_pMonitorStatus->isVisible() && m_pWidget->isVisible())
{
m_ptrMapControl->removeEventFilter(this);
m_pWidget->setVisible(false);
m_pMonitorStatus->setVisible(true);
// 组合使用setCentralWidget和setCentralWidget
this->takeCentralWidget();
this->setCentralWidget(m_pMonitorStatus);
}
else if (pageText != "监控状态" && m_pMonitorStatus->isVisible() && !m_pWidget->isVisible())
{
m_pMonitorStatus->setVisible(false);
m_pWidget->setVisible(true);
m_ptrMapControl->installEventFilter(this);
this->takeCentralWidget();
this->setCentralWidget(m_pWidget);
}
}
本文为博主原创文章,未经博主允许请勿转载!作者:ISmileLi