zoukankan      html  css  js  c++  java
  • chapter6 布局管理

    Chapter6 布局管理

    布局管理应该说是GUI当中很重要的一个方面.毕竟窗体程序是要展示的,既然要展示,就展现的美丽大方,各个部件摆放合理,而不应该令用户感到杂乱.Qt在这方面,提供了一整套的工具,比句布局管理器,如QHBoxLayout, QVBoxLayout, QGridLayout等等,方便我们构建合理的布局.

    提到布局,大致有三种方式:

    1.绝对位置法
    2.人工布局法
    3.布局管理器法.

    前面的两种方式,不仅需要一个个的计算每个窗体部件的位置和大小,这很费功夫,而且用户无法改变窗体的大小,比较呆板,做不到自响应,故而在实际中很少采纳.目前而言,基本都是采用第三种方式,即利用Qt自带的布局管理器,布局管理器很自动的为不同类型的窗体部件分配合理的空间,而且当整个窗体的布局大小发生改变时,也会自动的伸缩和扩展,使用起来很方便.

    构造窗体,可以采用纯代码的方式,也可以利用Qt Designer,二者结合当然也是可以的.

    finddialog.h

    #ifndef FINDFILEDIALOG_H
    #define FINDFILEDIALOG_H
    
    #include <QDialog>
    #include "ui_findfiledialog.h"
    
    class QGridLayout;
    class QHBoxLayout;
    class QVBoxLayout;
    class FindFileDialog : public QDialog, public Ui::FindFileDialog{
        Q_OBJECT
    
    public:
        FindFileDialog(QWidget *parent = 0);
    
    private:
        QGridLayout *leftLayout;
        QVBoxLayout *rightLayout;
        QHBoxLayout *mainLayout;
    };
    
    #endif
    

    窗体部件利用Qt Designer摆放好,然后在代码中给它们加上布局管理器.

    findfile.cpp

    #include <QtWidgets>
    #include "findfiledialog.h"
    
    FindFileDialog::FindFileDialog(QWidget *parent) : QDialog(parent){
        setupUi(this);
        
        leftLayout = new QGridLayout;
        leftLayout->addWidget(namedLabel, 0, 0);
        leftLayout->addWidget(namedLineEdit, 0, 1);
        leftLayout->addWidget(lookInLabel, 1, 0);
        leftLayout->addWidget(lookInLineEdit, 1, 1);
        leftLayout->addWidget(subfoldersCheckBox, 2, 0, 1, 2);
        leftLayout->addWidget(tableWidget, 3, 0, 1, 2);
        leftLayout->addWidget(messageLabel, 4, 0, 1, 2);
    
        rightLayout = new QVBoxLayout;
        rightLayout->addWidget(findButton);
        rightLayout->addWidget(stopButton);
        rightLayout->addWidget(closeButton);
        rightLayout->addStretch();
        rightLayout->addWidget(helpButton);
    
        mainLayout = new QHBoxLayout;
        mainLayout->addLayout(leftLayout);
        mainLayout->addLayout(rightLayout);
        setLayout(mainLayout);
        setWindowTitle(tr("Find Files or Folders")); 
    }
    

    QGridLayout会比较复杂一些,几个参数分别表示:行,列,行的伸展,列的伸展.

    以上代码可以看出,布局管理器是可以多层嵌套的,从最小的窗体部件开始,逐渐的一层层给它们添加布局管理器,最后调用setLayout()函数,将最顶层的布局管理器传入,即可.

    除了上面的三个布局管理器,还有一些,比如说:分组布局里经常使用到的QStackedLayout,还有一种把更多布局选择交给用户的切分窗口QSplitter,或者滚动区域QScrollArea,不过就使用频率而言,不如上面的三个.

    总结:最近的博客写的比较简单,只说最核心的,当然了,深入进去自然也是相当复杂的,这些,要等到以后学的逐步深入才会了解到的,这本书"C++ GUI Qt4",写的还是不错的,但是有些例子,的确是复杂了一些,打算先把基础的部分过一遍,然后再慢慢的实现.

    却道,此心安处是吾乡
  • 相关阅读:
    大数据组件原理总结-Hadoop、Hbase、Kafka、Zookeeper、Spark
    淘宝搜索引擎的缓存机制入门总结
    Log4j写日志文件使用详解
    storm入门(一):storm编程框架与举例
    storm入门(二):关于storm中某一段时间内topN的计算入门
    关于京东推荐模型的阅读理解
    运维开发入门记录
    Redis 3.0.0 集群部署
    Redis集群部署
    秘籍
  • 原文地址:https://www.cnblogs.com/lucifer25/p/7787602.html
Copyright © 2011-2022 走看看