QT - 布局方式

  • Qt里面的头文件和类名是一致的,知道头文件就知道类名,反之亦然

  • Qt头文件是没有.h的,基本都是以大写的Q开头

  • 后续的代码编写都在widget.hwidget.cpp

一. widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>

/*QT系统自己使用的命名空间预定义宏。也就是说以更快捷的方式定义QT自己的命名空间。
关于命名空间可以参考C++的命名空间*/

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;    
    QLineEdit *le,*le1;           //声明行编辑框对象
    QPushButton *pb;              //声明按钮框对象

};
#endif // WIDGET_H

1.1代码 解析

namespace Ui 
{ 
    class Widget; 
} 

这是声明了一个名称为 Ui 的命名空间namespace,包含一个类 Widget

但是这个类 Widget 并不是本文件里定义的类 Widget,而是 ui_widget.h 文件里定义的类,用于描述界面组件的。

这个声明相当于一个外部类型声明(具体要看完 ui_widget.h 文件内的解释之后才能搞明白)。

Widget 类的定义

widget.h 文件的主体部分是一个继承于 QWidget 的类 Widget 的定义,也就是本实例的窗体类。

class Widget : public QWidget        //创建继承自QWidget的自定义图形化界面类  
{
    Q_OBJECT                         //信号与槽对应的元

public:
    Widget(QWidget *parent = nullptr);//构造函数的声明,参数四QWidget*类型的指针
    ~Widget();                        //析构函数。

private:                             
    Ui::Widget *ui;                   //ui界面的指针,可以通过该指针使用ui界面上的组
件  
};

在 Widget 类中使用了宏 Q_OBJECT,这是使用 Qt 的信号与槽(signal 和 slot)机制的类都必须加入的一个宏(信号与槽在后面详细介绍)。

在 public 部分定义了 Widget 类的构造函数和析构函数。

  • 在 private 部分又定义了一个指针。

Ui::Widget *ui;      //ui界面的指针,可以通过该指针使用ui界面上的组件  

这个指针是用前面声明的 namespace Ui 里的 Widget 类定义的,所以指针 ui 是指向可视化设计的界面,后面会看到要访问界面上的组件,都需要通过这个指针 ui。

二.widget.cpp

#include "widget.h"
#include <QVBoxLayout>       //布局管理器头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
pb = new QPushButton("OK",this);//建立新的按钮框le = new QLineEdit(this); 
//建立新的行编辑框lele1 = new QLineEdit(this); 
//建立行编辑框le1
//方法1:pb -> setGeometry(0,100,50,50);   
//设置物理方位  写法:告诉坐标 向下是y轴 向右是x轴  并说出宽和高的值
//方法2: 布局管理器
QVBoxLayout *vbox = new QVBoxLayout; //建立一个布局管理器 QVBoxLayout 垂直布局管理器
vbox->addWidget(le1);  //布局行编辑框le1
vbox->addWidget(le);  //布局行编辑框
vbox->addWidget(pb);  //布局按钮this ->setLayout(vbox); 
//设置布局管理器 把主界面交给布局管理器//将行编辑框和按钮连接起来  实现按钮按下行编辑框清空
//c++升级 添加了信号与槽机制 connect绑定自己的激发信号和对方对象的槽 实现效果:按下按钮 激发对方槽函数的执行
//  connect(pb, SIGNAL(clicked(bool)),le,SLOT(clear()));
//实现点一下刺激两个对象 将一个对象中的东西搬移到另一个对象中去  解决方法:去升级主程序 槽函数的设计
connect(pb,SIGNAL(clicked(bool)),this,SLOT(movestr()));  //当按钮按下 我希望把按钮的信号SIGNAL 连接到 this 软件的槽SLOT 调用movestr函数
}Widget::~Widget()
{}
#include "widget.h"
#include "ui_widget.h"
#include <QVBoxLayout>         //竖直布局
#include <QHBoxLayout>         //水平布局
#include <QGridLayout>         //网状布局
#include <QFormLayout>         //表格布局
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    le = new QLineEdit(this);
    le1 = new QLineEdit(this);
    pb = new QPushButton("OK",this);
    QFormLayout *fbox = new QFormLayout;
    fbox->addRow("user1",le);
    fbox->addRow("user2",le1);
    fbox->addRow("zz",pb);
    this->setLayout(fbox);
 #if 0
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(le1);
    vbox->addWidget(pb);

    this->setLayout(vbox);
#endif

 #if 0
    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addWidget(le);
    hbox->addWidget(le1);
    hbox->addWidget(pb);
    this->setLayout(hbox);
#endif
#if 0
   QGridLayout *gbox = new QGridLayout;
   gbox->addWidget(le,0,0);
   gbox->addWidget(le1,1,1);
   gbox->addWidget(pb,2,0);
   this->setLayout(gbox);
#endif
}
Widget::~Widget()
{
    delete ui;
}

2.1代码 解析

Widget::Widget(QWidget *parent)
    : QWidget(parent)
  • 派生类不能在成员初始化列表中直接初始化基类的成员

初始化基类成员

构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员,“越级初始化”。派生类的构造函数的一般格式为:

派生类名(形参表):基类名1(形参表1),基类名2(形参表2)···

{···}

书籍,C++ Primer4中的15.4.2派生类构造函数有提到相关知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值