Qt_06

封装

在Qt中,有一些控件可以合成一个组合控件,就比如
在这里插入图片描述
拖动滑块,数字会变化;修改数字,滑块会动





创建Qt设计师界面类

在新建的项目Widget下,再Add New,选择QtQt 设计师界面类,这里就创建一个叫Item的设计师界面类,它会同时生成.cpp.h.ui文件


然后,我们要组合封装的控件,在item.ui实现

在这里插入图片描述
只需把要组合的控件放进去,水平布局啥的细节操作一下就算是组合到了


组合后,先看一下这组合控件是布局在哪个类的对象上,这里是QWidget,其实就是刚创建Qt 设计师界面类时选择的基类
在这里插入图片描述



然后再在项目widget.ui下使用这个组合控件,同样先创建一个QWidget类的控件,这里使用Contains中的Widget
在这里插入图片描述

添加后,对Widget该控件点击鼠标右键,有个提升为…,点击进去后
在这里插入图片描述

提升的类名称Item
然后全局包含添加提升

这里要注意啊,类名称是类名称,你自己定义的,会有大写小写字母,而系统会帮你创建头文件,cpp文件以及ui文件,这些都使用你的类名称作为文件名,只不过都是小写
所以一开始踩雷了,直接对着.ui文件名就输进去了
然后运行,报错



到这里,控件组合到一半了,因为这两个控件的功能还没链接起来





功能链接

#include "item.h"
#include "ui_item.h"

Item::Item(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Item)
{
    ui->setupUi(this);
//    void (QSpinBox::*spinSignal)(int) = &QSpinBox::valueChanged;

//    connect(ui->spinBox,spinSignal,ui->horizontalSlider,&QSlider::setValue);
    connect(ui->spinBox,&QSpinBox::valueChanged,ui->horizontalSlider,&QSlider::setValue);
    connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);


}

Item::~Item()
{
    delete ui;
}

视频中QSpinBox的成员函数valueChanged是有重载的,所以才需要用指针,但我在这个6.0版本下查找这个函数,是将一个重载版本重新取了个函数名,直接用也没问题

在这里插入图片描述

在这里插入图片描述



到这里就链接成功了






拓展

在这里插入图片描述

// 在widget.cpp中

    // 输入框line 只允许数字 限制在0~99
    ui->line->setValidator(new QIntValidator(0,99,this));


    
    connect(ui->btn_set,&QPushButton::clicked,[=](){
        QString XMAX=ui->line->text();
        int x=XMAX.toInt();
        ui->item->setData(x);
    });

    connect(ui->btn_get,&QPushButton::clicked,[=](){
        qDebug()<<ui->item->getData();
    });



//在item.cpp
void Item::setData(int val){
    ui->spinBox->setValue(val);
}

int Item::getData(){
   return ui->spinBox->value();
}

这里有很多细节,比如widget.cppitem,其实是widget.ui中创建的Item类的item对象,就是那个组合控件,组合控件写好后封装,类名是Item

line是那个输入框QLineEdit类的对象line

然后setData(int)getData()函数得在头文件中声明,在源文件中定义,且在类外定义,需用类名加以限定,而且这两个函数是Item这个类的吧,别搞到Widget类中去了







事件处理

新建一个项目,Qt_07Event,创建一个继承自QWidgetWidget类,生成了widget.hwidget.cppwidget.ui文件,然后再在该项目下创建一个C++类,取名为MyLabel,生成了mylabel.hmylabel.cpp两个文件

由于在创建类MyLabel时,只能继承三大基类,而这次的事件处理,需要用到QLabel,所以要手动修改MyLabel的基类



分别在头文件mylabel.h中,修改包含的头文件,以及继承的父类

#include <QWidget>
class MyLabel : public QWidget
{

}

#include <QLabel>
class MyLabel : public QLabel
{

}

还要修改源文件mylabel.cpp

MyLabel::MyLabel(QWidget *parent) : QWidget(parent)
{

}

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{

}

所以修改父类只需要三步





上面特别创建了一个MyLabel类,是为了写入一些函数,然后在本项目的widget.ui提升Label

在这里插入图片描述
这样创建的Label才会响应我们写的函数




响应事件

这里重载两个鼠标响应事件,enterEventleaveEvent,作用是鼠标进入或离开label,都会有响应

自然的,在头文件声明,在源文件定义

#include "mylabel.h"

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{

}

void MyLabel::enterEvent(QEnterEvent *){
    qDebug()<<"进入";
};

void MyLabel::leaveEvent(QEvent *){
    qDebug()<<"离开";
};

这里其实又和视频中有些不一样,视频中两个函数的参数都是 QEvent *
但我这里写的,一个是QEnterEvent * ,一个是QEvent *,这是查看了文档的结果
如果都写成某一种参数,那就会有个函数不起作用




如果需要只有在鼠标左键才能触发函数,只需要在函数中加一个判断

	// 这个适合按下和松开的函数
	if(ev->button() == Qt::LeftButton)
	{

	}

	// 移动是持续性操作 而点击是瞬间操作
	if(ev->buttons() & Qt::LeftButton)
	{

	}





鼠标在label上不需要按下就能显示移动

	//在cpp中
	// 设置鼠标追踪 默认false
	this->setMouseTracking(true);




格式化

在Qt中,格式化占位符是用%1%2%3等等表示

#include <QMouseEvent>

void MyLabel::mousePressEvent(QMouseEvent *ev){
    QString str = QString("x = %1 , y = %2").arg(ev->x()).arg(ev->y());
       qDebug()<<str;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值