Qt4学习笔记(九),QMainWindow中的布局管理

给QWidget或者QDialog设置布局的时候方式很简单。创建好一个布局:mainLayout,然后不停地把各个控件往mainLayout里面放,最后调用setLayout(mainLayout)就行了。

QMainWindow中使用这个方法的时候却不管用,因为QMainWindow是默认有layout的,所以再次设置layout会失效。

会出现这种提示:

QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
这句话的意思是说,你已经给MainWindow设置过一个布局了,再设置一个会出错。

该如何给QMainWindow正确地设置布局呢
要想QMainWidget创建布局,合理的步骤应该是这样的:

第一步创建一个QWidget实例,并将这个实例设置为centralWidget:

然后创建一个主布局mainLayout,并把所需要的所有控件都往里面放(工具栏、菜单栏、状态栏除外):
...

最一步就是将widget的布局设置为mainLayout

[cpp]  view plain  copy
  1. widget = new QWidget();    
  2. this->setCentralWidget(widget);    
  3. cbox = new QCheckBox(this);    
  4. cbox->setText("choose");    
  5. cbox->setChecked(false);    
  6. button = new QPushButton(this);    
  7. QVBoxLayout *layout = new QVBoxLayout(this);    
  8.     
  9. layout->addWidget(cbox);    
  10. layout->addWidget(button);    
  11.     
  12. widget->setLayout(layout);    

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QTabWidget;
class QTreeView;
class QTableView;
class QGraphicsView;
class QListWidget;
class QVBoxLayout;
class QWidget;

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow(QWidget *parent=0);
	~MainWindow();
	void createWidget();
	void createLayout();
	void createConnection();


private:
	QTabWidget *m_pTabWidget;
	QTreeView *m_pTreeView;
	QTableView *m_pTableView;
	QGraphicsView *m_pImgView;
	QListWidget *m_pInfoWidget;
	QVBoxLayout *m_pMainLayout;
	QWidget *m_pMainWidget;
	QWidget *m_pAddWidget;
	QWidget *m_pManagerWidget;
};

#endif // MAINWINDOW_H
#include <QTabWidget>
#include <QTreeView>
#include <QTableView>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QSplitter>
#include <QListWidget>
#include <QGraphicsView>
#include "GBK.h"

#include "MainWindow.h"

MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent)
{
	createWidget();
	createLayout();
	createConnection();
}

MainWindow::~MainWindow()
{

}

void MainWindow::createWidget()
{
	//QMainWindow不能增加添加布局,所以先定义一个QWidget
	m_pMainWidget = new QWidget(this);
	//把定义的QWidget设置为当前QMainWindow的主窗口
	this->setCentralWidget(m_pMainWidget);
	m_pTabWidget = new QTabWidget(m_pMainWidget);
	m_pTreeView = new QTreeView(m_pMainWidget);
	m_pTableView = new QTableView(m_pMainWidget);
	m_pImgView = new QGraphicsView(m_pMainWidget);
	m_pInfoWidget = new QListWidget(m_pMainWidget);
	m_pMainLayout = new QVBoxLayout(m_pMainWidget);
	m_pAddWidget = new QWidget(m_pTabWidget);
	m_pManagerWidget = new QWidget(m_pTabWidget);
	//添加2个选项卡窗口
	m_pTabWidget->addTab(m_pAddWidget, GBK::ToUnicode("添加"));
	m_pTabWidget->addTab(m_pManagerWidget, GBK::ToUnicode("管理"));

	showMaximized();
}

void MainWindow::createLayout()
{
	QHBoxLayout *pViewLayout = new QHBoxLayout(m_pMainWidget);
	//水平分裂器
	QSplitter *pHSplitter = new QSplitter(m_pMainWidget);
	pHSplitter->setOrientation(Qt::Horizontal);
	//垂直分裂器
	QSplitter *pVSplitter = new QSplitter(pHSplitter);
	pVSplitter->setOrientation(Qt::Vertical);

	//向垂直分裂器添加2个控件
	pVSplitter->addWidget(m_pImgView);
	pVSplitter->addWidget(m_pInfoWidget);

	//给水平分裂器添加3个控件,3个控件的比例
	pHSplitter->addWidget(m_pTreeView);
	pHSplitter->addWidget(m_pTableView);
	pHSplitter->addWidget(pVSplitter);
	//3个控件的比例的比例分别为2:8:2
	pHSplitter->setStretchFactor(0, 2);
	pHSplitter->setStretchFactor(1, 8);
	pHSplitter->setStretchFactor(2, 2);

	//把水平分裂器添加到水平布局中
	pViewLayout->addWidget(pHSplitter);

	QHBoxLayout *pTopLayout = new QHBoxLayout(m_pMainWidget);
	//把选项卡控件添加到顶部的水平布局中
	pTopLayout->addWidget(m_pTabWidget);
	
	//把顶部水平布局和下部垂直布局添加到主垂直布局中
	m_pMainLayout->addLayout(pTopLayout);
	m_pMainLayout->addLayout(pViewLayout);
	
	//设置顶部和下部的比例为1:12
	m_pMainLayout->setStretchFactor(pTopLayout, 1);
	m_pMainLayout->setStretchFactor(pViewLayout, 12);

	m_pMainWidget->setLayout(m_pMainLayout);
}

void MainWindow::createConnection()
{

}



猜你喜欢

转载自blog.csdn.net/u012592062/article/details/80392171
qt4
今日推荐