zoukankan      html  css  js  c++  java
  • Day02_设计器的使用之控件篇


    前篇------布局


    图一

    图二

    设计上图所示Qt界面,首先是整个界面的布局,布局类型有两种:绝对定位和布局定位:

    绝对定位:给出组件的坐标和长宽值。用户改变窗口大小或者拖动窗口边缘时,采用绝对位置的组件不会有任何响应,组件不会自由伸缩。

    布局定位:把组件放入布局后,布局由专门的布局管理器进行管理。当需要调整大小或位置时,Qt使用对应的布局管理器进行调整。

    三种常用的布局方式:

    1)、水平布局:QHBoxLayout,按照水平方向从左到右布局

    2)、垂直布局:QVBoxLayout,按照竖直方向从上到下布局

    3)、网格布局:QGridLayout,在一个网格中进行布局

    图一中整个界面分为四部分:图像区、输入区、按钮区、滑变区

    图像区的设计:

      在容器中选择一个控件widget层在容器层中拖入Label标签,在标签中插入图片,为了保持图片居中,在space中选择两个水平弹簧保持图片布局位置随着缩放而保持居中位置。在图像区设计好之后,图像区内部使用水平布局,在整个界面使用垂直布局。

    输入区的设计:

      输入区中包含两个名称的textLabel和两个lineEditor行编辑区,在容器中拖入一个控件widget后,在控件中拖入组件,widget中的组件选择的布局方式为QGridWidget

    按钮区的设计:

       同样加入一个widget,之后再widget中添加button,可通过弹簧控件按钮相对位置,在两个按钮中间,为了保持外观,可在按键中间的位置添加弹簧,在弹簧的sizetype属性中设置为fixed,在sizehint属性中设置宽度的大小。

    滑变区的设计在下半部分说明


    前篇------自定义控件

    上文中提到了水平/垂直/网格布局:

    接下来举一个水平布局的例子:

      首先是在Qt中创建一个工程,Qwidget作为基类,姑且自定义类名为MyWidget,创建好的工程主函数为

     1 #include "mywidget.h"
     2 #include <QApplication>
     3 #include<QSpinBox>
     4 #include<QSlider>
     5 #include<QHBoxLayout>
     6 #include<QObject>
     7 
     8 
     9 int main(int argc, char *argv[])
    10 {
    11     QApplication a(argc, argv);
    12     //创建一个w派生串口
    13     MyWidget w;
    14     //设置窗口名称,姑且叫Jerry吧,注意字符串需要用双引号
    15     w.setWindowTitle("Jerry");
    16     //创建一个滑块,并设置w为其父窗口,注意向其传入父窗口的地址,使用&取地址符
    17     QSpinBox *spinBox = new QSpinBox(&w);
    18     //创建一个滑条,并设其为水平形式
    19     QSlider *slider = new QSlider(Qt::Horizontal, &w);
    20     spinBox->setRange(0, 130);   //设计滑块滑动范围
    21     slider->setRange(0, 130);    //设计滑条滑动范围
    22     //槽函数连接
    23     /*
    24      * 信号发出方:滑条
    25      * 发出信号:数字改变
    26      * 信号接收方:滑块
    27      * 信号处理函数(槽函数):显示滑条数值
    28     */
    29     QObject::connect(slider, &QSlider::valueChanged,
    30     spinBox, &QSpinBox::setValue);
    31     void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
    32     /*
    33      * 信号发出方:滑块
    34      * 发出信号:滑块信号
    35      * 信号接收方:滑条
    36      * 信号处理函数(槽函数):设置滑条标志位
    37     */
    38     QObject::connect(spinBox, spinBoxSignal,
    39     slider, &QSlider::setValue);
    40     spinBox->setValue(35);   //给滑块设定初始值,不设置的话默认为0
    41     //给控件设置布局
    42     QHBoxLayout *layout = new QHBoxLayout;
    43     layout->addWidget(spinBox);
    44     layout->addWidget(slider);
    45     w.setLayout(layout);
    46 
    47     w.show();
    48 
    49     return a.exec();
    50 }

    运行结果:

    同理,在已经创建好的界面中,如图二所示,添加一个widget组件,然后选中工程--->新建一个C++类------>C++ Class---->基类(base class)选为Qwidget---->起一个派生名(比如SmallWidget)

    接着在smallwidget.cpp文件中:

    #include "smallwidget.h"
    #include <QSpinBox>
    #include <QSlider>
    #include <QHBoxLayout>
    
    
    SmallWidget::SmallWidget(QWidget *parent) : QWidget(parent)
    {
        QSpinBox *spin = new QSpinBox(this);
        QSlider *slider = new QSlider(Qt::Horizontal, this);
    
        //把控件添加到布局中
        QHBoxLayout *hLayout = new QHBoxLayout(this);
        hLayout->addWidget(spin);
        hLayout->addWidget(slider); 
         /*
          * 用法:static_cast < type-id > ( expression )
          * 该运算符把expression转换为type-id类型
         */
        connect(spin, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
                slider, &QSlider::setValue);
    
        QObject::connect(slider, &QSlider::valueChanged,
        spin, &QSpinBox::setValue);
        /*
         * QSpinBox::valueChanged返回值的类型有int和str两种,使用woid函数强制类型转换
        */
    //    void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
         
    //    QObject::connect(spin, spinBoxSignal,
    //    slider, &QSlider::setValue);
    }

    然后在ui界面之前添加的空白widget中右击,选择提升为,提升的类名称为class派生类的名字SmallWidget,选择全局包含,添加,提升即可。

    最终的显示结果为:

  • 相关阅读:
    在一个很长的字符串中搜索自定义字符串的问题(通过多线程实现)
    老鼠走迷宫
    js控制父子页面传值(iframe和window.open)
    C#后台跳转
    CSS小技巧-图片自动缩放
    js中去除换行( )
    js去除首尾空格
    JQuery隔行变色
    Web开发在线工具
    JQuery标签去重与数组去重
  • 原文地址:https://www.cnblogs.com/luxinshuo/p/12229925.html
Copyright © 2011-2022 走看看