给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
- widget = new QWidget();
- this->setCentralWidget(widget);
- cbox = new QCheckBox(this);
- cbox->setText("choose");
- cbox->setChecked(false);
- button = new QPushButton(this);
- QVBoxLayout *layout = new QVBoxLayout(this);
- layout->addWidget(cbox);
- layout->addWidget(button);
- 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()
{
}