给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() { }