在设计较复杂的GUI用户界面的时候,仅通过指定窗口部件的父子关系以期达到加载和排列窗口部件的方法是行不通的,最好的办法是使用Qt提供的界面管理器。 需要的头文件:
#include <QGridLayout>
使用如下:
//只有部分代码: //创建一个网格布局管理器对象mainLayout,并用this指出父窗口 QGridLayout *mainLayout = new QGridLayout(this); //将控件label1跟button防止在该管理器中,还可以创建布局管理器对象时不指出父窗口 mainLayout->addWidget(label1,0,0); mainLayout->addWidget(button,1,1); ........... //将布局管理器添加到对应窗口部件对象中。 setLayout(mainLayout);该类常用于类似文件资源管理器的窗口设计中,可以灵活的分割窗口的布局。 接下来我们直接贴代码,并且进行注释。
#include <QApplication> #include <QSplitter> #include <QTextEdit> #include <QTextCodec> int main(int argc, char *argv[]) { QApplication a(argc, argv); QFont font("ZYSong18030",12);//指示显示字体(参数1),以及大小(参数2) a.setFont(fond); //新建一个QSplitter类对象,作为主分割窗口,并设定为水平分割 QSplitter *splitterMain = new QSplitter(Qt::Horizontal,0); //新建一个QTextEdit对象,并将其插入主分割窗口splitterMain中。 QTextEdit *textLeft = new QTextEdit(QObject::tr("Left Widget"),splitterMain); //设定TextEdit中文字的对其方式为居中对齐 textLeft->setAlignment(Qt::AlignCenter); //右分割窗口,垂直分割,并以主窗口为父窗口 QSplitter *splitterRight = new QSplitter(Qt::Vertical,splitterMain); //显示拖拽窗口的更新是否为实时更新,默认为true,false的话会在拖拽的时候只显示一条灰色的粗线条 splitterRight->setOpaqueResize(flase); //这几句跟上面一样,都是创建一个QTextEdit对象,只不过插入的是splitterRight中 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); //设定可伸缩控件,它的第一个参数用于指定设置的控件序号,控件序号按插入的 //先后次序从0开始编,第二个参数为大于0的数,表示此控件为可伸缩控件,以上 //实例设计设定右部分窗口为可伸缩控件,当整个窗口宽度变化时,左边的宽度不变 splitterMain->setStretchFactor(1,1); splitterMain->setWindowTitle(QObject::tr("Splitter")); splitterMain->show(); return a.exec(); }运行结果如下:(可以随意拖拉) 关于以上textLeft->setAlignment(Qt::AlignCenter);,对其方式还有:
Qt::AlignLeft 左对齐 Qt::AlignRight 右对齐 Qt::AlignCenter 居中对齐 Qt::AlignHCenter 水平居中 Qt::AlignVCenter 垂直居中 Qt::AlignUp 与顶端对齐 Qt::AlignBottom 与底部对齐设置字体类型以及大小:
QFont font("ZYSong18030",12);定义分割窗口,第一个参数为分布格式,第二个为其父窗口:
QSplitter *splitterMain = new QSplitter(Qt::Horizontal,0);定义一个文本框类,用户可以在里面自己打字,tr为文本框初始内容,可以被用户删改,若该文本框为空,则第一个参数为0,第二个参数则是指出它插入的窗口 指针方法指出内部的文字的对齐方式。
QTextEdit *textUp = new QTextEdit(QObject::tr("Top Widget"),splitterRight); textUp->setAlignment(Qt::AlignCenter);显示拖拽窗口的更新是否为实时更新,默认为true,false的话会在拖拽的时候只显示一条灰色的粗线条,这个我个人其实实践之后感觉没多大差别,不知道是不是个人问题
splitterRight->setOpaqueResize(flase);设定可伸缩控件,它的第一个参数用于指定设置的控件序号,控件序号按插入的先后次序从0开始编,第二个参数为大于0的数,表示此控件为可伸缩控件,以上实例设计设定右部分窗口为可伸缩控件,当整个窗口宽度变化时,左边的宽度不变 splitterMain->setStretchFactor(1,1);
设置停靠窗口的一般流程如下: (1)创建一个QDockWidge对象的停靠窗口 (2)设置此停靠窗口的属性,通常调用setFeatures()和setAllowedAreas()两种方法 (3)新建一个要插入停靠窗口的控件,常用的有QListWidget和QTextEdit (4)将控件插入停靠窗口,调用QDockWidget的setWidget()方法 (5)使用addDockWidget()方法在MainWindow中加入此停靠窗口
停靠窗口QDockWidget类的使用,窗口1只可在主窗口的左边或右边停靠,窗口2只可在浮动和右部停靠两种状态间切换,切不可移动;窗口3可实现停靠后窗口的各种状态。
新建一个Qt Widgets Application,项目名为:“DockWindows”,基类选择“QMainWindow”,基类命名为:“DockWindows",取消”创建界面“复选框的选中状态。 在dockwindows.h写入以下代码:(我的编译器一开始就写好了,没有任何改动)
#ifndef DOCKWINDOWS_H #define DOCKWINDOWS_H #include <QMainWindow> class DockWindows : public QMainWindow { Q_OBJECT public: DockWindows(QWidget *parent = 0); ~DockWindows(); }; #endif // DOCKWINDOWS_H在dockwindows.cpp文件写入:
#include "dockwindows.h" #include <QDockWidget> #include <QTextEdit> DockWindows::DockWindows(QWidget *parent) : QMainWindow(parent) { //设置主窗口的标题栏文字 setWindowTitle(tr("DockWindows")); //定义一个TextEdit对象作为主窗口 QTextEdit *te = new QTextEdit(this); //在该窗口写入Main Window te->setText(tr("Main Window")); te->setAlignment(Qt::AlignCenter);//字体居中对齐 //将此编辑框设为主窗口的中央窗体 setCentralWidget(te); //停靠窗口1 //定义一个停靠窗口,命名为DockWindow1并且以自己为父窗口 QDockWidget *dock = new QDockWidget(tr("DockWindow1"),this); dock->setFeatures(QDockWidget::DockWidgetMovable);//特征:可移动 //设置可移动范围为左窗口和右窗口 dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); //定义一个文本框对象 QTextEdit *te1 = new QTextEdit(); //向文本框写入以下内容 te1->setText(tr("Window1,The dock widget can be moved between docks by the user")); //把该文本框定义为停靠窗口的部件 dock->setWidget(te1); //将该部件放在主窗口的右边 addDockWidget(Qt::RightDockWidgetArea,dock); //停靠窗口2 dock = new QDockWidget(tr("DockWindow2"),this); dock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);//可关闭也可浮动 QTextEdit *te2 = new QTextEdit(); te2->setText(tr("Window2,The dockwidget can be detached from the main windows,""and floated as an independent window,and can be closed")); dock->setWidget(te2); addDockWidget(Qt::RightDockWidgetArea,dock); //停靠窗口3 dock = new QDockWidget(tr("DockWindow3"),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); } DockWindows::~DockWindows() { }在main.cpp写入:(这个代码也是编译器一开始就有的,不知道你们需不需要修改干嘛的)
#include "dockwindows.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); DockWindows w; w.show(); return a.exec(); }运行结果如下: setFeatures()方法设置停靠窗体的特性,原形如下:
void setFeatures(DockWidgetFeatures features)参数QDockWidget::DockWidgetFeatures指定停靠窗口的特性,包括以下几种参数
(1)QDockWidget::DockWidgetClosable: 停靠窗体可关闭 (2)QDockWidget::DockWidgetMovable: 停靠窗口可移动 (3)QDockWidget::DockWidgetFloatable: 停靠窗口可浮动 (4)QDockWidget::AllDockWidgetFeatures: 拥有停靠窗体的所有特性 (5)QDockWidget::NoDockWidgetFeatures:不可移动不可关闭不可浮动此参数可采用 | 的方式对停靠窗体进行特性的设定叠加。
setAllowedAreas()方法设置停靠窗口可停靠的区域,原型如下:
void setAllowedAreas(Qt::DockWidgetAreas areas)参数Qt::DockWidgetAreas包括以下几种参数:
(1)Qt::LeftDockWidgetArea: //可在主窗口的左侧停靠 (2)Qt::RightDockWidgetArea: //可在主窗口的右侧停靠 (3)Qt::TopDockWidgetAtra: //可在主窗口的顶端停靠 (4)Qt::BottomDockWidgetArea: //可在主窗口的底部停靠 (5)Qt::AllDockWidgetArea: //可在主窗口的任意位置停靠 (6)Qt::NoDockWidgetArea: //只可停靠在插入处此参数也可采用 | 的方式对停靠窗体进行特性的叠加。
堆栈船体QStackedWidget类也是应用程序中常用的,多与列表框QListWidget类及下拉列表框配合使用。 使用:当选择左边列表框中不同的选项时,右边显示所选的窗体,以下代码使用QListWidget列表框。 新建Qt Widget Application,项目名称为StackedWidget,基类选择QDialog,类名命名为“StackDlg”,取消创建界面复选框。 在stackdlg.h写入:
#ifndef STACKDLG_H #define STACKDLG_H #include <QListWidget> #include <QStackedWidget> #include <QLabel> #include <QDialog> class StackDlg : public QDialog { Q_OBJECT public: StackDlg(QWidget *parent = 0); ~StackDlg(); private: QListWidget *list; QStackedWidget *stack; QLabel *label1; QLabel *label2; QLabel *label3; }; #endif // STACKDLG_H在stackdlg.cpp写入:
#include "stackdlg.h" #include <QHBoxLayout> StackDlg::StackDlg(QWidget *parent) : QDialog(parent) { setWindowTitle("StackedWidget");//设置该窗口的名字 //新建一个QListWidget控件对象 list = new QListWidget(this); //向QListWidget控件插入三个条目作为选择项 list->insertItem(0,tr("Window1")); list->insertItem(1,tr("window2")); list->insertItem(2,tr("window3")); //创建三个标签对象,作为堆栈窗口需要显示的三层窗体 label1 = new QLabel(tr("WindowText1")); label2 = new QLabel(tr("WindowText2")); label3 = new QLabel(tr("WindowText3")); stack = new QStackedWidget(this);//新建一个堆栈窗体控件 //将创建的三个QLabel标签控件插入堆栈窗体 stack->addWidget(label1); stack->addWidget(label2); stack->addWidget(label3); QHBoxLayout *mainLayout = new QHBoxLayout(this);//对整个对话框进行布局 mainLayout->setMargin(5);//设定对话框的边距为5 mainLayout->setSpacing(5);//设定各个控件之间的间距为5 mainLayout->addWidget(list); mainLayout->addWidget(stack,0,Qt::AlignHCenter); //setStretchFactor函数作用为设定可伸缩控件,第一个参数用于指定设置的控件,第二个大于0表示此控件可伸缩 mainLayout->setStretchFactor(list,1); mainLayout->setStretchFactor(stack,3); //将QListWidget的currentRowChanged信号与堆栈窗体的setCurrentIndex()槽函数链接 //实现按选择显示窗体,此处的堆栈窗体index按插入顺序从0起排序,与QListWidget条目顺序一致 connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int))); } StackDlg::~StackDlg() { }