QMainWindow中setCentralWidget和takeCentralWidget组合使用

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);
	}
}
posted @ 2017-11-20 11:06  ISmileLi  阅读(731)  评论(0)    收藏  举报