分割窗口QSplitter
直接上示例,内有详细备注。
一个简单的分割窗口功能,整个对话框由三个窗口组成,各窗口之间的大小可随意拖曳改变。
效果图如下:
代码如下:
#include "mainwindow.h"
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>
#include <QTextCodec> //提供文本编码之间的转换
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//设置主窗口的字体
QFont font("ZYsong18030", 12);
a.setFont(font);
//主分割窗口
//水平切割,没有指定父控件
QSplitter* mainSplitter = new QSplitter(Qt::Horizontal, 0);
//左边的文本编辑框,指定父控件为mainSplitter
QTextEdit* leftText = new QTextEdit(QObject::tr("left widget"), mainSplitter);
//设置该编辑框的文本对称方式:居中。 Qt::AlignHCenter 水平居中, Qt::AlignVCenter 垂直居中
leftText->setAlignment(Qt::AlignCenter);
//右部分割窗口
//垂直分割,并指定父控件为主分割窗口,即将右部分割窗口放入主分割窗口中
QSplitter* rightSplitter = new QSplitter(Qt::Vertical, mainSplitter);
//右部分割窗口中的两个QTextEdit
QTextEdit* upText = new QTextEdit(QObject::tr("up widget"), rightSplitter);
upText->setAlignment(Qt::AlignCenter);
QTextEdit* bottomText = new QTextEdit(QObject::tr("bottom widget"), rightSplitter);
bottomText->setAlignment(Qt::AlignCenter);
//设置右部分割窗口的分割条在拖拽时是否实时更新
rightSplitter->setOpaqueResize(false); //不实时更新
//设置右部分割窗口的伸缩随主窗口改变
//参数1:表示控件,按插入顺序从0开始 参数2:大于0的值,表示该控件为可伸缩控件
mainSplitter->setStretchFactor(1, 1);
//设置主分割窗口的标题
mainSplitter->setWindowTitle(QObject::tr("Splitter"));
//因为mainSplitter没有指定父控件,所以需要手动显示
mainSplitter->show();
MainWindow w;
w.show();
return a.exec();
}
停靠窗口QDockWidget
一个停靠窗口QDockWdiget的使用,一个QMainWindow内有一个QTextEdit作为窗体的主题控件,另新建三个QDockWdiget停靠窗口对象,设置其各自的停靠属性并添加到卖弄Window主窗口中。
效果图如下:
代码如下:
#include "dockwindows.h"
#include <QTextEdit>
#include <QDockWidget>
//直接在创建的QMainWindow类的构造中编写,其他文件均不变。
DockWindows::DockWindows(QWidget *parent)
: QMainWindow(parent)
{
//设置主窗口标题
setWindowTitle(tr("DockWindow"));
//定义一个QTextEdit对象作为主窗口
QTextEdit* text = new QTextEdit(this);
//设置该text对象的文本
text->setText(tr("Main Window"));
//设置居中显示
text->setAlignment(Qt::AlignCenter);
//将text对象设置成主窗口的中央窗口
setCentralWidget(text);
//停靠窗口1
QDockWidget* dock = new QDockWidget(tr("DockWindow1"), this);
//设置停靠窗口1 的属性为可移动的
dock->setFeatures(QDockWidget::DockWidgetMovable);
//设置停靠窗口1的可浮动的区域: 主窗口的左边或者右边
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
//没有指定父对象的QTextEdit1
QTextEdit* te1 = new QTextEdit();
te1->setText(tr("Window1, the dock widget can be moved between docks by user"));
//将te1设置成dock的控件
dock->setWidget(te1);
//最后将停靠窗口1添加到主窗口中并制定初始位置:主窗口的右边
addDockWidget(Qt::RightDockWidgetArea, dock);
//停靠窗口2
dock = new QDockWidget(tr("DockWindow2"), this);
//设置停靠窗口2的属性为可关闭、可浮动
dock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
QTextEdit* te2 = new QTextEdit();
te2->setText(tr("Window2, the dock widget can be detached from the main window,"
"and foloated as an independent window, and can be closed"));
dock->setWidget(te2);
addDockWidget(Qt::RightDockWidgetArea, dock);
//停靠窗口3
dock = new QDockWidget(tr("Window3"), this);
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
QTextEdit* te3 = new QTextEdit();
te3->setText(tr("Window3, The dock widget can be closed, moved, and floated"));
dock->setWidget(te3);
addDockWidget(Qt::RightDockWidgetArea, dock);
}
堆栈窗体QStackedWdiget
创建一个继承自QDialog的dialog类,内有两个主要控件:QListWidget和QStackedWidget,当选择QListWidget中的item时,切换至QStackedWidget中对应索引的内容。
效果图如下:
代码如下:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QListWidget* list;
QStackedWidget* stack;
QLabel* label1;
QLabel* label2;
QLabel* label3;
};
#endif // DIALOG_H
#include "dialog.h"
#include <QHBoxLayout>
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("WindowTest1"));
label2 = new QLabel(tr("WindowTest2"));
label3 = new QLabel(tr("WindowTest3"));
stack = new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
QHBoxLayout* mainLayout = new QHBoxLayout(this);
//设置对话框或窗体的边距为5
mainLayout->setMargin(5);
//设定各控件之间的间距为5
mainLayout->setSpacing(5);
mainLayout->addWidget(list);
//添加控件, 指定StrechFactor为0表示不可伸缩,
mainLayout->addWidget(stack, 0, Qt::AlignHCenter);
//设定可伸缩控件,参数1指定控件(序号从0起编号), 参数2大于0表示此控件可伸缩
//注意list和stack的伸缩比例为1:3
mainLayout->setStretchFactor(list, 1);
mainLayout->setStretchFactor(stack, 3);
connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));
}
总结
三个小示例仅使用了这三个窗体类中的部分属性及对应常用的接口,具体应用可根据需求查阅Qt的帮助文档。