QT5布局管理
分割窗口 QSplitter类
分割窗口 QSplitter类在应用程序中经常用到,它可以灵活分布窗口的布局,经常用 在类似文件资源管理器的窗口设计中。
示例代码:
#include <QApplication>
#include <QTextEdit>
#include <QPixmap>
#include <QSplitter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFont font("ZYSongl8030",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 ();
}
效果展示:
停靠窗口 QDockWidget类
停靠窗口 QDockWidget类也是应用程序中经常用到的。
示例代码:
#include <QApplication>
#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow *window = new QMainWindow();
window->setWindowTitle (( "DockWindows") ) ;//设置主窗口 的标题栏文字 QTextEdit *te=new QTextEdit (this) ;//定义一个 QTextEdit 对象作为主窗口 te->setText(tr("Main Window"));
//停靠窗口 1
QDockWidget *dock=new QDockWidget(("DockWindowl"),window);
dock->setFeatures(QDockWidget::DockWidgetMovable);
//可移动
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
QTextEdit *tel =new QTextEdit();
tel->setText(("Windowl,The dock widget can be moved between docks by the usern n "));
dock->setWidget(tel);
window->addDockWidget(Qt::RightDockWidgetArea,dock);
//停靠窗口 2
dock=new QDockWidget(("DockWindow2"),window);
dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable) ; //可关闭、可浮动
QTextEdit *te2 =new QTextEdit();
te2->setText(("Window2,The dock widget can be detached from the main window,""and floated as an independent window, and can be closed"));
dock->setWidget(te2);
window->addDockWidget(Qt::RightDockWidgetArea,dock);
//停靠窗口 3
dock=new QDockWidget (("DockWinciow3") , window);
dock->setFeatures (QDockWidget::AllDockWidgetFeatures) ;//全部特性
QTextEdit *te3 =new QTextEdit();
te3->setText (( "Window3, The dock widget can be closed, moved, and floated"));
dock->setWidget(te3);
window->addDockWidget(Qt::RightDockWidgetArea,dock);
window->show();
return a.exec ();
}
效果展示:
堆栈窗体QStackedWidget类
堆栈窗体QStackedWidget类也是应用程序中经常用到的。在实际应用中,堆 栈窗体多与列表框QListWidget及下拉列表框QComboBox配合使用。
示例代码:
#include <QApplication>
#include <QMainWindow>
#include <QComboBox>
#include <QStackedWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <iostream>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow *window = new QMainWindow();
QWidget *widget = new QWidget();
QVBoxLayout *layout = new QVBoxLayout();
widget->setLayout(layout);
window->setCentralWidget(widget);
QComboBox *box = new QComboBox();
QStringList list{"1","2","3"};
box->addItems(list);
QStackedWidget *sw = new QStackedWidget();
QPushButton *btn = new QPushButton("1");
QPushButton *btn1 = new QPushButton("2");
QPushButton *btn2 = new QPushButton("3");
sw->addWidget(btn);
sw->addWidget(btn1);
sw->addWidget(btn2);
layout->addWidget(box);
layout->addWidget(sw);
QObject::connect(box, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [sw](int index){
sw->setCurrentIndex(index);
});
window->show();
return a.exec ();
}
效果展示:
基本布局(QLayout)
Qt 提供了 QHBoxLayout 类、QVBoxLayout 类及 QGridLayout 类等的基本布局 管理,分别是水平排列布局、垂直排列布局和网格排列布局。它们之间的继承关系
布局中常用的方法有addWidget()和addLayout ()。
addWidget()方法用于向布局中加入需要布局的控件,add Widget()的函数原型
void addWidget(QWidget *widget,int fromRow,int fromColumn,int rowSpanfint columnspan,Qt::Alignment alignment=0 )
addLayout ()方法用于向布局中加入需要布局的子布局,addLayout ()的函数原 型如下:
void addLayout
(QLayout Payout, //表示需要插入的子布局对象
int row. //插入的起始行
int column. //插入的起始列
int rowSpan, //表示占用的行数
int columnSpan, //表示占用的列数
Qt::Alignment alignment=0 //指定对齐方式
)
上述例子中已经使用了部分的Layout代码。此处不再做详细展示了。