Qt分割窗口QSplitter类

来源:互联网 发布:恺英网络王悦结婚照 编辑:程序博客网 时间:2024/05/29 21:35

转载地址: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 就可以,比如:

[cpp] view plain copy
print?
  1. QSplitter *splitter = new(nothrow)  QSplitter(parent);  
  2. if (NULL == splitter){ ... // 错误处理 }  

第二个用起来需要两个参数,需要设定水平或者垂直分割,比如:

[cpp] view plain copy
print?
  1. QSplitter  *splitter = new(nothrow)  QSplitter(Qt::Vertical, this);  
  2. if (NULL == splitter) { ... // 错误处理 }  

第一个参数通过Qt::Horizontal 和 Qt::Vertical来设定为水平分割或垂直分割。第二个设定0代表是主窗口无父窗口,this代表当前窗口,parent代表父窗口。

3. 类的常用方法:

[cpp] view plain copy
print?
  1. void    setHandleWidth(int)                // 设置QSplitter的Handle宽度  
  2. void    addWidget(QWidget * widget)        // 添加widget  
  3. int count() const                      // 获取QSplitter当前widget的数量  
  4. void    insertWidget(int index, QWidget * widget) // 在当前QSplitter序列中index位置插入widget  
  5. void    setSizes(const QList<int> & list)  // 设置QSplitter的布局,需要一个QList<int>   
  6. void    setOrientation(Qt::Orientation)    // 设置QSplitter分割的方向  

关于QSplitter的介绍就暂时这么多,大牛们请无视,仅仅是想帮助初学者快速理解,下面是一些比较常用的小例子 或者 网上较为有名的开源小程序涉及到QSplitter的,有兴趣的可以继续阅读:

例1:


[cpp] view plain copy
print?
  1. #include <QApplication>  
  2. #include <QLabel>  
  3. #include <QSplitter>  
  4. #include <QMessageBox>  
  5. #include <QString>  
  6.   
  7. using namespace std;  
  8.   
  9. int main(int argc, char *argv[])  
  10. {  
  11.     QApplication app(argc, argv);  
  12.   
  13.     QSplitter * splitter = new(nothrow) QSplitter(Qt::Horizontal);  
  14.     if(NULL == splitter)  
  15.     {  
  16.         QMessageBox messageBox;  
  17.         messageBox.setWindowTitle(QObject::tr("Warning"));  
  18.         messageBox.setText(QObject::tr("splitter new failed !"));  
  19.         messageBox.addButton(QObject::tr("OK"), QMessageBox::AcceptRole);  
  20.         messageBox.exec();  
  21.     }  
  22.     splitter->setHandleWidth(5);  
  23.     splitter->setStyleSheet("QSplitter::handle { background-color: black }"); //set splitter style  
  24.     QLabel *labelA = new QLabel(QObject::tr("Left"));  
  25.     QLabel *labelB = new QLabel(QObject::tr("Right"));  
  26.   
  27.     splitter->addWidget(labelA);  
  28.     splitter->addWidget(labelB);  
  29.     splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);  
  30.     splitter->show();  
  31.   
  32.     return app.exec();  
  33. }  

例2:


[cpp] view plain copy
print?
  1. #include <QApplication>  
  2. #include <QLabel>  
  3. #include <QSplitter>  
  4. #include <QMessageBox>  
  5. #include <QString>  
  6.   
  7. using namespace std;  
  8.   
  9. int main(int argc, char *argv[])  
  10. {  
  11.     QApplication app(argc, argv);  
  12.   
  13.     QSplitter * splitter = new(nothrow) QSplitter(Qt::Horizontal);  
  14.     if(NULL == splitter)  
  15.     {  
  16.         QMessageBox messageBox;  
  17.         messageBox.setWindowTitle(QObject::tr("Warning"));  
  18.         messageBox.setText(QObject::tr("splitter new failed !"));  
  19.         messageBox.addButton(QObject::tr("OK"), QMessageBox::AcceptRole);  
  20.         messageBox.exec();  
  21.     }  
  22.     splitter->setHandleWidth(5);  
  23.     splitter->setStyleSheet("QSplitter::handle { background-color: red }"); //set splitter style  
  24.     QLabel *labelA = new QLabel(QObject::tr("Top"));  
  25.     QLabel *labelB = new QLabel(QObject::tr("Bottom"));  
  26.   
  27.     splitter->addWidget(labelA);  
  28.     splitter->addWidget(labelB);  
  29.     splitter->setOrientation(Qt::Vertical);  
  30.     splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);  
  31.     splitter->show();  
  32.   
  33.     return app.exec();  
  34. }  

例3:


[cpp] view plain copy
print?
  1. #include <QApplication>  
  2. #include <QLabel>  
  3. #include <QSplitter>  
  4. #include <QString>  
  5. #include <QTextEdit>  
  6.   
  7. using namespace std;  
  8.   
  9. int main(int argc, char *argv[])  
  10. {  
  11.     QApplication app(argc, argv);  
  12.   
  13.     QSplitter *splitterMain = new(nothrow) QSplitter(Qt::Horizontal,0);  
  14.     if(NULL == splitterMain)  
  15.     {  
  16.        // error dispose  
  17.        return -1;  
  18.     }  
  19.     //主splitter, 以下填充text和子splitter  
  20.     QTextEdit *textLeft = new(nothrow) QTextEdit(QObject::tr("Left Widget"),splitterMain);  
  21.     if(NULL == textLeft)  
  22.     {  
  23.         // error dispose  
  24.         return -1;  
  25.     }  
  26.     textLeft->setAlignment(Qt::AlignCenter);  
  27.     QSplitter *splitterRight = new(nothrow) QSplitter(Qt::Vertical, splitterMain);  
  28.     if(NULL == splitterRight)  
  29.     {  
  30.         // error dispose  
  31.         return -1;  
  32.     }  
  33.     splitterRight->setOpaqueResize(false);  // 设置拖动时是否同步更新  
  34.   
  35.     //开始填充右边的splitter, 放两个text  
  36.     QTextEdit *textTop = new(nothrow) QTextEdit(QObject::tr("Right Top Widget"), splitterRight);  
  37.     if(NULL == textTop)  
  38.     {  
  39.         // error dispose  
  40.         return -1;  
  41.     }  
  42.     textTop->setAlignment(Qt::AlignCenter);  
  43.     QTextEdit *textBottom = new(nothrow) QTextEdit(QObject::tr("Right Bottom Widget"), splitterRight);  
  44.     if(NULL == textBottom)  
  45.     {  
  46.         // error dispose  
  47.         return -1;  
  48.     }  
  49.     textBottom->setAlignment(Qt::AlignCenter);  
  50.   
  51.     //设置主splitter  
  52.     splitterMain->setStretchFactor(1,1);  
  53.     splitterMain->setWindowTitle(QObject::tr("Splitter"));  
  54.     splitterMain->show();  
  55.   
  56.     return app.exec();  
  57. }  
说明:
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


如果大家感觉我的文章对大家有帮助,欢迎关注我哦。


0 0
原创粉丝点击