Qt分割窗口QSplitter类

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

  1. QSplitter *splitter = new(nothrow)  QSplitter(parent);  
  2. if (NULL == splitter){ ... // 错误处理 }  
  QSplitter *splitter = new(nothrow)  QSplitter(parent);
  if (NULL == splitter){ ... // 错误处理 }

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

  1. QSplitter  *splitter = new(nothrow)  QSplitter(Qt::Vertical, this);  
  2. if (NULL == splitter) { ... // 错误处理 }  
 QSplitter  *splitter = new(nothrow)  QSplitter(Qt::Vertical, this);
 if (NULL == splitter) { ... // 错误处理 }

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

3. 类的常用方法:

  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分割的方向  
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:


  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. }  
#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:


  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. }  
#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:


  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. }  
#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


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


已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页