QSplitter就是一个可以包含一些其他窗口部件的部件。在切分窗口QSplitter中的这些窗口部件会通过切分条Splitter handle而分割开来。用户可以通过拖动这些分割条改变切分条中子窗口的大小。QSplitter中的子窗口部件将会自动按照创建时的顺序一个挨着一个的放在一起,并且以切分窗口分割条来分割相邻的窗口。下面是代码实例
#include <QtGui>int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextEdit *editor1 = new QTextEdit; //定于在splitter中的三个编辑框
QTextEdit *editor2 = new QTextEdit;
QTextEdit *editor3 = new QTextEdit;
QSplitter splitter( Qt::Horizontal); //定义一个切分窗口
splitter.addWidget(editor1); //将文件控件加入到切分框
splitter.addWidget(editor2);
splitter.addWidget(editor3);
editor1->setPlainText("Mon enfant, ma soeur,\n"
"Songe la douceur\n"
"D'aller l-bas vivre ensemble,\n"
"Aimer loisir,\n"
"Aimer et mourir\n"
"Au pays qui te ressemble.");
editor2->setPlainText("My child, my sister,\n"
"think of the sweetness\n"
"of going there to live together!\n"
"To love at leisure,\n"
"to love and to die\n"
"in a country that is the image of you!");
editor3->setPlainText("Mein Kind, meine Schwester,\n"
"denke an den Traum\n"
"dort hin(unter) zu gehen um zusammen\n"
"zu leben und in aller Ruhe zu lieben,\n"
"Zu lieben und zu sterben\n"
"in dem Land, das dir gleicht.");
splitter.setWindowTitle(QObject::tr("Splitter")); //设置标题
splitter.show();
return app.exec();
}
效果如下:
可以随意改变各个窗口大小:
另外下面演示下使用多个splitter进行水平或者垂直方向上的嵌套。本代码适用于《C++ GUI QT4》
mailclient.cpp. 其界面布局部分代码如下
//窗口布局
rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(messagesTreeWidget); //在右窗口中添加一个邮件列表
rightSplitter->addWidget(textEdit); //显示文本邮件
rightSplitter->setStretchFactor(1, 1); //保证textEdit伸展到多余的空间
mainSplitter = new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(foldersTreeWidget);
mainSplitter->addWidget(rightSplitter);
mainSplitter->setStretchFactor(1, 1); //使用两个setStretchFactor保证了把多余的额外空间都留给textEdit
setCentralWidget(mainSplitter);
setWindowTitle(tr("Mail Client"));
效果如下图:
(清悠我心:http://hi.baidu.com/%E6%B8%85%E6%82%A0%E6%88%91%E5%BF%83/home)
分割窗口在应用程序中经常用到,比如在类似资源管理器的窗口设计中:
下面用代码实现上面窗口的设计:
1.建立项目时基类选择QMainWindow,取消Gernerate form复选框的选中状态。
2.在main.cpp中编写如下代码:
- #include <QtGui/QApplication>
- #include "mainwindow.h"
- #include <QSplitter>
- #include <QTextCodec>
- #include <QTextEdit>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- //设置字体
- QFont font("ZYSong18030",12);
- a.setFont(font);
- QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
- //主splitter,以下填充text和子splitter
- 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);
- //开始填充右边的splitter,放上两个text
- QTextEdit *textTop=new QTextEdit(QObject::tr("Right Top Widget"),splitterRight);
- textTop->setAlignment(Qt::AlignCenter);
- QTextEdit *textBottom=new QTextEdit(QObject::tr("Right Bottom Widget"),splitterRight);
- textBottom->setAlignment(Qt::AlignCenter);
- //设置主splitter
- splitterMain->setStretchFactor(1,1);
- splitterMain->setWindowTitle(QObject::tr("Splitter"));
- splitterMain->show();
- return a.exec();
- }
- #include <QtGui/QApplication>
- #include "mainwindow.h"
- #include <QSplitter>
- #include <QTextCodec>
- #include <QTextEdit>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- //设置字体
- QFont font("ZYSong18030",12);
- a.setFont(font);
- QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
- //主splitter,以下填充text和子splitter
- 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);
- //开始填充右边的splitter,放上两个text
- QTextEdit *textTop=new QTextEdit(QObject::tr("Right Top Widget"),splitterRight);
- textTop->setAlignment(Qt::AlignCenter);
- QTextEdit *textBottom=new QTextEdit(QObject::tr("Right Bottom Widget"),splitterRight);
- textBottom->setAlignment(Qt::AlignCenter);
- //设置主splitter
- splitterMain->setStretchFactor(1,1);
- splitterMain->setWindowTitle(QObject::tr("Splitter"));
- splitterMain->show();
- return a.exec();
- }
解析:
1.QSplitter的构造方法:
QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);
第一个参数通过Qt::Horizontal 和 Qt::Vertical来设定为水平分割或垂直分割。第二个设定0代表是主窗口,无父窗口。
不过子splitter设置的
new QSplitter(Qt::Vertical,splitterMain);
代表主窗口是splitterMain。则子splitter就被添加到splitterMain中。
添加时为从左至右(或从上至下)添加;
2.添加QTextEdit控件。
QTextEdit *textLeft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);
第一个参数设置文本内容,第二个参数设置主窗体。
3.设置拖动时是否实时更新
splitterRight->setOpaqueResize(false);
false为不实时更新——在拖动时候只显示一条灰色的线条,在拖动到位并释放鼠标后再显示分割条。默认为true——实时更新。
4.设定可伸缩控件:
splitterMain->setStretchFactor(1,1);
第一个参数代表控件序号,第一个序号为0.后面参数0代表不可伸缩,非0代表可伸缩。
这里设置右边的可伸缩。当拉伸整个窗口时候,左边保持原来宽度。
拉伸后,我们发现左边的宽度不变。