Qt布局管理
By Xchen 20160628
分割窗口
类QSplitter
先看一个实例
example01:
#include "mainwindow.h"
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFont font("ZYSong18090",12);
a.setFont(font);
QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);
QTextEdit *textLeft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);
textLeft->setAlignment(Qt::AlignCenter);
QSplitter *splitterRight=new QSplitter(Qt::Vertical,splitterMain);
splitterRight->setOpaqueResize(false);//设置窗口分割线是否实时显示
QTextEdit *textUp=new QTextEdit(QObject::tr("Top Widget"),splitterRight);
textUp->setAlignment(Qt::AlignCenter);
QTextEdit *textBottom=new QTextEdit(QObject::tr("Bottom Widget"),splitterRight);
textBottom->setAlignment(Qt::AlignCenter);
splitterMain->setStretchFactor(1,1);//设置右窗口为可伸缩控件,即在整个对话框大小改变时右窗口大小随之改变
splitterMain->setWindowTitle(QObject::tr("Splitter"));
splitterMain->show();
//MainWindow w;
//w.show();
return a.exec();
}
对于上面的例子,一定要在main()函数中建立QSplitter对象,这样可以直接将窗口分割,所以QSplitter对象相当于一个控件并且可以直接显示。
停靠窗口
类QDockWidget
example02:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("DockWindows"));
QTextEdit *text=new QTextEdit(this);
text->setText(tr("Main Window"));
text->setAlignment(Qt::AlignCenter);
setCentralWidget(text);
QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
QTextEdit *text1=new QTextEdit();
text1->setText(tr("this is dockwindow1"));
dock->setWidget(text1);
addDockWidget(Qt::RightDockWidgetArea,dock);
dock=new QDockWidget(tr("DockWindow2"),this);
dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
QTextEdit *text2=new QTextEdit();
text2->setText(tr("this is dockwindow2"));
dock->setWidget(text2);
addDockWidget(Qt::RightDockWidgetArea,dock);
dock=new QDockWidget(tr("DockWindow3"),this);
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
QTextEdit *text3=new QTextEdit();
text3->setText(tr("this is dockwindow1"));
dock->setWidget(text3);
addDockWidget(Qt::RightDockWidgetArea,dock);
}
在这个例子中可以看出停靠窗口QDockWidget的使用步骤为:
1、创建QDockWidget对象的停靠窗口
2、设置窗口属性
QDockWidget *dock=new QDockWidget(tr("DockWindow1"),this);
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
3、新建控件
QTextEdit *text1=new QTextEdit();
text1->setText(tr("this is dockwindow1"));
4、将控件插入停靠窗体
dock->setWidget(text1);
5、将停靠窗口加入MainWindow
addDockWidget(Qt::RightDockWidgetArea,dock);
堆栈窗口
类QStackedWidget
example03:
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("StackedWidget"));
list=new QListWidget(this);
list->insertItem(0,tr("window1"));
list->insertItem(1,tr("window2"));
list->insertItem(2,tr("window3"));
label1=new QLabel(tr("this is window1"));
label2=new QLabel(tr("this is window2"));
label3=new QLabel(tr("this is window3"));
stack=new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
QHBoxLayout *mainLayout=new QHBoxLayout(this);
mainLayout->setMargin(5);
mainLayout->setSpacing(5);
mainLayout->addWidget(list);
mainLayout->addWidget(stack,0,Qt::AlignHCenter);
mainLayout->setStretchFactor(list,1);
mainLayout->setStretchFactor(stack,3);
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
}
堆栈窗口的使用多与QListWidget和QComboBox配合使用。例子中是让堆栈窗口与QListWidget配合使用。
基本布局
类QLayout
它们的继承关系:
可以在布局中常用的方法为addWidget()和addLayout()就可以将指定控件加入到布局中。