转载地址:http://blog.csdn.net/tgzjz/article/details/45197003
今天在做多个widget布局时,用到了这个QSplitter类,作用是将多个widget在一个窗口中按设定的比例分割。
先简单介绍一下该类的相关基础知识:
1. 使用该类的头文件: #include < QSplitter >
2. 如何构造该类:
该类的构造函数有两个 QSplitter(QWidget * parent = 0) 和 QSplitter(Qt::Orientation orientation, QWidget * parent = 0)
第一个用起来就是直接 new 就可以,比如:
QSplitter *splitter = new(nothrow) QSplitter(parent);
if (NULL == splitter){ ... // 错误处理 }
第二个用起来需要两个参数,需要设定水平或者垂直分割,比如:
- QSplitter *splitter = new(nothrow) QSplitter(Qt::Vertical, this);
- if (NULL == splitter) { ... // 错误处理 }
QSplitter *splitter = new(nothrow) QSplitter(Qt::Vertical, this);
if (NULL == splitter) { ... // 错误处理 }
第一个参数通过Qt::Horizontal 和 Qt::Vertical来设定为水平分割或垂直分割。第二个设定0代表是主窗口无父窗口,this代表当前窗口,parent代表父窗口。
3. 类的常用方法:
- void setHandleWidth(int) // 设置QSplitter的Handle宽度
- void addWidget(QWidget * widget) // 添加widget
- int count() const // 获取QSplitter当前widget的数量
- void insertWidget(int index, QWidget * widget) // 在当前QSplitter序列中index位置插入widget
- void setSizes(const QList<int> & list) // 设置QSplitter的布局,需要一个QList<int>
- void setOrientation(Qt::Orientation) // 设置QSplitter分割的方向
void setHandleWidth(int) // 设置QSplitter的Handle宽度
void addWidget(QWidget * widget) // 添加widget
int count() const // 获取QSplitter当前widget的数量
void insertWidget(int index, QWidget * widget) // 在当前QSplitter序列中index位置插入widget
void setSizes(const QList<int> & list) // 设置QSplitter的布局,需要一个QList<int>
void setOrientation(Qt::Orientation) // 设置QSplitter分割的方向
关于QSplitter的介绍就暂时这么多,大牛们请无视,仅仅是想帮助初学者快速理解,下面是一些比较常用的小例子 或者 网上较为有名的开源小程序涉及到QSplitter的,有兴趣的可以继续阅读:
例1:
- #include <QApplication>
- #include <QLabel>
- #include <QSplitter>
- #include <QMessageBox>
- #include <QString>
- using namespace std;
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QSplitter * splitter = new(nothrow) QSplitter(Qt::Horizontal);
- if(NULL == splitter)
- {
- QMessageBox messageBox;
- messageBox.setWindowTitle(QObject::tr("Warning"));
- messageBox.setText(QObject::tr("splitter new failed !"));
- messageBox.addButton(QObject::tr("OK"), QMessageBox::AcceptRole);
- messageBox.exec();
- }
- splitter->setHandleWidth(5);
- splitter->setStyleSheet("QSplitter::handle { background-color: black }"); //set splitter style
- QLabel *labelA = new QLabel(QObject::tr("Left"));
- QLabel *labelB = new QLabel(QObject::tr("Right"));
- splitter->addWidget(labelA);
- splitter->addWidget(labelB);
- splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- splitter->show();
- return app.exec();
- }
#include <QApplication>
#include <QLabel>
#include <QSplitter>
#include <QMessageBox>
#include <QString>
using namespace std;
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSplitter * splitter = new(nothrow) QSplitter(Qt::Horizontal);
if(NULL == splitter)
{
QMessageBox messageBox;
messageBox.setWindowTitle(QObject::tr("Warning"));
messageBox.setText(QObject::tr("splitter new failed !"));
messageBox.addButton(QObject::tr("OK"), QMessageBox::AcceptRole);
messageBox.exec();
}
splitter->setHandleWidth(5);
splitter->setStyleSheet("QSplitter::handle { background-color: black }"); //set splitter style
QLabel *labelA = new QLabel(QObject::tr("Left"));
QLabel *labelB = new QLabel(QObject::tr("Right"));
splitter->addWidget(labelA);
splitter->addWidget(labelB);
splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
splitter->show();
return app.exec();
}
例2:
- #include <QApplication>
- #include <QLabel>
- #include <QSplitter>
- #include <QMessageBox>
- #include <QString>
- using namespace std;
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QSplitter * splitter = new(nothrow) QSplitter(Qt::Horizontal);
- if(NULL == splitter)
- {
- QMessageBox messageBox;
- messageBox.setWindowTitle(QObject::tr("Warning"));
- messageBox.setText(QObject::tr("splitter new failed !"));
- messageBox.addButton(QObject::tr("OK"), QMessageBox::AcceptRole);
- messageBox.exec();
- }
- splitter->setHandleWidth(5);
- splitter->setStyleSheet("QSplitter::handle { background-color: red }"); //set splitter style
- QLabel *labelA = new QLabel(QObject::tr("Top"));
- QLabel *labelB = new QLabel(QObject::tr("Bottom"));
- splitter->addWidget(labelA);
- splitter->addWidget(labelB);
- splitter->setOrientation(Qt::Vertical);
- splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- splitter->show();
- return app.exec();
- }
#include <QApplication>
#include <QLabel>
#include <QSplitter>
#include <QMessageBox>
#include <QString>
using namespace std;
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSplitter * splitter = new(nothrow) QSplitter(Qt::Horizontal);
if(NULL == splitter)
{
QMessageBox messageBox;
messageBox.setWindowTitle(QObject::tr("Warning"));
messageBox.setText(QObject::tr("splitter new failed !"));
messageBox.addButton(QObject::tr("OK"), QMessageBox::AcceptRole);
messageBox.exec();
}
splitter->setHandleWidth(5);
splitter->setStyleSheet("QSplitter::handle { background-color: red }"); //set splitter style
QLabel *labelA = new QLabel(QObject::tr("Top"));
QLabel *labelB = new QLabel(QObject::tr("Bottom"));
splitter->addWidget(labelA);
splitter->addWidget(labelB);
splitter->setOrientation(Qt::Vertical);
splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
splitter->show();
return app.exec();
}
例3:
- #include <QApplication>
- #include <QLabel>
- #include <QSplitter>
- #include <QString>
- #include <QTextEdit>
- using namespace std;
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QSplitter *splitterMain = new(nothrow) QSplitter(Qt::Horizontal,0);
- if(NULL == splitterMain)
- {
- // error dispose
- return -1;
- }
- //主splitter, 以下填充text和子splitter
- QTextEdit *textLeft = new(nothrow) QTextEdit(QObject::tr("Left Widget"),splitterMain);
- if(NULL == textLeft)
- {
- // error dispose
- return -1;
- }
- textLeft->setAlignment(Qt::AlignCenter);
- QSplitter *splitterRight = new(nothrow) QSplitter(Qt::Vertical, splitterMain);
- if(NULL == splitterRight)
- {
- // error dispose
- return -1;
- }
- splitterRight->setOpaqueResize(false); // 设置拖动时是否同步更新
- //开始填充右边的splitter, 放两个text
- QTextEdit *textTop = new(nothrow) QTextEdit(QObject::tr("Right Top Widget"), splitterRight);
- if(NULL == textTop)
- {
- // error dispose
- return -1;
- }
- textTop->setAlignment(Qt::AlignCenter);
- QTextEdit *textBottom = new(nothrow) QTextEdit(QObject::tr("Right Bottom Widget"), splitterRight);
- if(NULL == textBottom)
- {
- // error dispose
- return -1;
- }
- textBottom->setAlignment(Qt::AlignCenter);
- //设置主splitter
- splitterMain->setStretchFactor(1,1);
- splitterMain->setWindowTitle(QObject::tr("Splitter"));
- splitterMain->show();
- return app.exec();
- }
#include <QApplication>
#include <QLabel>
#include <QSplitter>
#include <QString>
#include <QTextEdit>
using namespace std;
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSplitter *splitterMain = new(nothrow) QSplitter(Qt::Horizontal,0);
if(NULL == splitterMain)
{
// error dispose
return -1;
}
//主splitter, 以下填充text和子splitter
QTextEdit *textLeft = new(nothrow) QTextEdit(QObject::tr("Left Widget"),splitterMain);
if(NULL == textLeft)
{
// error dispose
return -1;
}
textLeft->setAlignment(Qt::AlignCenter);
QSplitter *splitterRight = new(nothrow) QSplitter(Qt::Vertical, splitterMain);
if(NULL == splitterRight)
{
// error dispose
return -1;
}
splitterRight->setOpaqueResize(false); // 设置拖动时是否同步更新
//开始填充右边的splitter, 放两个text
QTextEdit *textTop = new(nothrow) QTextEdit(QObject::tr("Right Top Widget"), splitterRight);
if(NULL == textTop)
{
// error dispose
return -1;
}
textTop->setAlignment(Qt::AlignCenter);
QTextEdit *textBottom = new(nothrow) QTextEdit(QObject::tr("Right Bottom Widget"), splitterRight);
if(NULL == textBottom)
{
// error dispose
return -1;
}
textBottom->setAlignment(Qt::AlignCenter);
//设置主splitter
splitterMain->setStretchFactor(1,1);
splitterMain->setWindowTitle(QObject::tr("Splitter"));
splitterMain->show();
return app.exec();
}
说明:
splitterRight->setOpaqueResize(false); // 设置拖动时是否实时更新
false为不实时更新——在拖动时候只显示一条灰色的线条,在拖动到位并释放鼠标后再显示分割条。默认为true——实时更新。
splitterMain->setStretchFactor(1,1); // 设定可伸缩控件:
第一个参数代表Qt的控件序号,第一个序号为0. 后面参数0代表不可伸缩,非0代表可伸缩。这里设置右边的可伸缩。当拉伸整个窗口时候,左边保持原来宽度。拉伸后,我们发现左边的宽度不变。
在文章的最后推荐两个项目,都涉及了QSplitter:
一个是24K纯开源的大牛写的 一个安全防护软件的制作,地址:http://www.cnblogs.com/csuftzzk/p/Trojan_Assessment_Platform_3.html
另一个是我们Qt群主的博客写的一个仿360界面的文章,地址:http://blog.csdn.NET/liang19890820/article/details/9234857
如果大家感觉我的文章对大家有帮助,欢迎关注我哦。