• Qt5开发从入门到精通——第三篇(窗口篇——分割窗口)


    欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
    博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀


    前言

    本章节将会给大家带来堆栈窗体(QSplitter类)的详细使用方法


    一、分割窗口QSplitter

    1.1、使用场景

    分割窗口 QSplitter 类在应用程序中经常用到,它可以灵活分割窗口的布局,经常用在类似文件资源管理器的窗口设计中 。

    1.2、分割窗口实例

    一个十分简单的分割窗口功能,整个窗口由三个子窗口组成,各个子窗口之间的大小可随意拖曳改变,效果如图 一 所示。
    图一
    在这里插入图片描述

    1.3、main.cpp原码解析

    #include "widget.h"
    #include 
    #include 
    #include 
    int main(int argc, char *argv[])
    {
        //QApplication a(argc, argv);
        //Widget w;
        //w.show();
        QApplication a(argc, argv);
          //主分割窗口
          QFont font ("ZYSongl8030", 40);
          a.setFont(font);
          QSplitter *splitterMain =new QSplitter (Qt::Horizontal, 0); //(a)
          QTextEdit *textLeft =new QTextEdit (QObject::tr("Qao Yi Bo Yi 1"), splitterMain); //(b)
          textLeft->setAlignment(Qt::AlignCenter);
          //右分割窗口
          QSplitter *splitterRight =new QSplitter (Qt::Vertical, splitterMain); // (d)
          splitterRight->setOpaqueResize(false); //(e)
          QTextEdit *textUp = new QTextEdit(QObject::tr("Qao Yi Bo Yi 2"), splitterRight);
          textUp->setAlignment(Qt::AlignCenter);
          QTextEdit *textBottom =new QTextEdit(QObject::tr("Qao Yi Bo Yi 3"),splitterRight);
          textBottom->setAlignment(Qt::AlignCenter);
          splitterMain->setStretchFactor(1,1);
          splitterMain->setWindowTitle(QObject::tr("Splitter"));   //声明主窗口的名称
          splitterMain->show();
          return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    其中,
    (a)QSplitter *splitterMain =new QSplitter (Qt::Horizontal, 0); 新建一个 QSplitter 类对象,
    作为主分割窗口,设定此分割窗口为水平分割窗口。
    (b)QTextEdit *textLeft =new QTextEdit (QObject::tr(“Qao Yi Bo Yi 1”), splitterMain); 新建一个
    QTextEdit 类对象,并将其插入主分割窗口中。
    (c)textLeft->setAlignment(Qt::AlignCenter);设定 TextEdit 中文字的对齐方式,常用的对齐方式有以下几种。

    • Qt::AlignLeft: 左对齐。
    • Qt::AlignRight: 右对齐。
    • Qt::AlignCenter: 文字居中 (Qt: :AlignHCenter 为水平居中,Qt::AlignVCenter 为垂直居中)。
    • Qt::AlignUp: 文字与顶部对齐。
    • Qt::AlignBottom: 文字与底部对齐。

      (d) QSplitter *splitterRight =new QSplitter (Qt::Vertical, splitterMain): 新建一个 QSplitter类对象,作为右分割窗口,设定此分割窗口为垂直分割窗口,并以主分割窗口为父窗口。
      (e)splitterRight->setOpaqueResize(false):调用setOpaqueResize(bool)方法用于设定分割窗口的分割条在拖曳时是否为实时更新显示,若设为 true 则实时更新显示,若设为 false 则在拖曳时只显示一条灰色的粗线条,在拖曳到位并释放鼠标后再显示分割条。默认设置为 true 。
      (f)splitterMain->setStretchFactor(1,1):调用 setStretchFactor()方法用于设定可伸缩控件,它的第 1 个参数用千指定设置的控件序号,控件序号按插入的先后次序从 0 起依次编号;第 2个参数为大于 0 的值,表示此控件为可伸缩控件。此实例中设定右部的分割窗口为可伸缩控件,当整个对话框的宽度发生改变时,左部的文件编辑框宽度保待不变,右部的分割窗口宽度随整个对话框大小的改变进行调整。

    二、使用类画出控件进行窗口分割实例

    2.1、使用控件原理分析到使用类分割实战

    通过上述描述,可理解到,窗口的分割是填充不同的类进行形分割如三个QTextEdit 类,因此我们只需要把控件用类的形式进行封装,展现到窗口上即可,实例如图二。
    图二

    在这里插入图片描述

    2.2、原码实例

    2.2.1 、left.h

    #ifndef LEFT_H
    #define LEFT_H
    
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    namespace Ui {
    class Widget;
    }
    
    class left : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit left(QWidget *parent = nullptr);
        ~left();
    
    
    
    
    private:
    QPushButton *button,*button1;
    QLineEdit  *edit1,*edit2,*edit3,*edit4;
    QGridLayout *layout;
    
    
    private slots:
    void on_clicked();
    void on_clicked1();
    public:
    void myLayout();
    
    
    private:
        Ui::Widget *ui;
    };
    
    
    
    
    #endif // LEFT_H
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    2.2.2 、widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private:
        Ui::Widget *ui;
        QSplitter *psp;
        left *ps;
        QTextEdit *text;
    
    };
    
    #endif // WIDGET_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    2.2.3 、left.cpp

    #include "left.h"
    #include "ui_widget.h"
    
    left::left(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        myLayout();
    }
    
    
    left::~left()
    {
        delete ui;
    }
    
    
    void left::myLayout()
    {
        button = new QPushButton;
        button1 = new QPushButton;
    
        layout = new QGridLayout(this);
    
        edit1  = new QLineEdit;
        edit2  = new QLineEdit;
        edit3  = new QLineEdit;
        edit4  = new QLineEdit;
    
        button1->setText("清除");
        button->setText("结果");
    
        connect(button,SIGNAL(clicked(bool)),this,SLOT(on_clicked()));   //连接按钮
        connect(button1,SIGNAL(clicked(bool)),this,SLOT(on_clicked1()));
    
        layout->addWidget(button,1,0,Qt::Alignment());       //初始化画图
    
        layout->addWidget(edit1,0,0,Qt::Alignment());
        layout->addWidget(edit2,0,1,Qt::Alignment());
        layout->addWidget(edit3,0,2,Qt::Alignment());
        layout->addWidget(edit4,1,1,Qt::Alignment());
        layout->addWidget(button1,1,2,Qt::Alignment());
    
    }
    
    void left::on_clicked()     //计算大小
    {
    
       int a = edit1->text().toInt();
       int b = edit3->text().toInt();
       QString c = edit2->text();
    
       if(c=="+")
       {
           edit4->setText(QString::number(a+b));
       }
       if(c=="-")
       {
           edit4->setText(QString::number(a-b));
       }
       if(c=="*")
       {
           edit4->setText(QString::number(a*b));
       }
       if(c=="/")
       {
           edit4->setText(QString::number(a/b));
       }
    
    
    
    }
    
    void left::on_clicked1()   //清除
    {
    
        edit1->clear();
        edit2->clear();
        edit3->clear();
        edit4->clear();
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    2.2.4 、main.cpp

    #include "widget.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.2.5 、widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        ps  = new left();
        text = new QTextEdit;
        psp = new QSplitter(Qt::Horizontal,nullptr);
    
        psp->addWidget(ps);
        psp->addWidget(text);
        psp->show();
    
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    总结

    分割窗口可使用控件及类填充进行分割,在Qt当中控件实际上就是Qt官方封装的类工程文件已经上传GitHub、Git Bash Here 拉取命令如下

    git clone https://github.com/dhn111/Qt.git
    
    
    • 1
    • 2
  • 相关阅读:
    【mysql】复杂语句的分析过程
    文本挖掘与NLP笔记——代码向:分词
    Android Studio开发工具学习之Git远程仓库拉取与推送
    java毕业设计大学生食堂饭菜价格信息管理系统mybatis+源码+调试部署+系统+数据库+lw
    如何创建多语言WordPress网站[专家建议]
    知识分享系统
    Flex布局常用属性详解
    【MySQL】sql调优实战教学
    问题 R: 胜利大逃亡(HUST)
    机器学习——推荐系统和强化学习
  • 原文地址:https://blog.csdn.net/weixin_44759598/article/details/126280067