我是靠谱客的博主 顺心黑米,最近开发中收集的这篇文章主要介绍【Qt】事件,自定义控件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在之前的代码中没有使用系统提供的UI。在接下来的代码中我们开始使用系统自带的ui文件,此时窗口cpp文件里的构造函数变为

myWindow::myWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::myWindow)	//注释的三处为新增内容
{
    ui->setupUi(this);		//
}
myWindow::~myWindow()
{
    delete ui;				//
}

这时我们双击ui文件进入窗口编辑区,通过拖拽即可添加组件。我们想要在函数中引用组件,语法为ui->组件名,其后与之前内容相同。
比如

ui->button1->setText("123");			//new

QPushButton *btn=new QPushButton(this);	//before
btn->setText("123");

这些是组件名
在这里插入图片描述

接下来我们自定义组件,即编写原有组件的继承类以实现更多功能。添加myLabel.h .cpp(先添加QWidget,然后改成QLabel)

在这里我们为标签定义了鼠标事件

//mylabel.h

#include <QLabel>

class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);
protected:		//定义了鼠标事件
    void mousePressEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

signals:

};

//mylabel.cpp,#include <QMouseEvent>

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

}
void myLabel::mouseMoveEvent(QMouseEvent *ev){
	//默认为false,在false的情况下只有点击了之后才可以追踪鼠标的移动
    this->setMouseTracking(true);

    int i=ev->x();
    int j=ev->y();
    //QString内部可以使用html语言来修改显示格式,
    //用%1,%2来传参,参数来自arg(i),语法类似printf
    QString text=QString("<center>pos:%1,%2</center>").arg(i).arg(j);
    this->setText(text);
}

void myLabel::mousePressEvent(QMouseEvent *ev){
    if(ev->button()==Qt::RightButton){
    	//定义了右键点击的事件
        qDebug() << "right";
    }
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev){}

将自定义组件应用的方法:在编辑器拖入label,右键->提升为->在基类输入刚才编辑的类名->点右边添加->点下方提升,此时添加的label就从QLabel类提升到MyLabel类(可以理解为所属的类更精确了)

这时我们添加的标签便可以追踪鼠标的行为

接下来我们在window定义定时器(来自系统的行为)
在头文件添加

protected:
    void timerEvent(QTimerEvent *);
private:
    int clock_1;
    int clock_2;

然后在cpp当中

myWindow::myWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::myWindow)
{
    ui->setupUi(this);
    //在构造函数创建定时器(用int来区分不同的定时器)
    //参数为两次启动定时器的时间间隔,单位ms(1000ms=1s)
    clock_1=this->startTimer(1000);
    clock_2=this->startTimer(500);
}

myWindow::~myWindow()
{
    delete ui;
}
void myWindow::timerEvent(QTimerEvent *e){
//用e->timerId()来区分不同的定时器,执行不同的行为
    if(e->timerId()==this->clock_1){
        static int a = 0;
        a++;
        ui->la1->setText(QString("time:%1").arg(a));

        if(a==10){
            this->killTimer(clock_1);	//传递参数,关闭定时器
        }
    }
    if(e->timerId()==this->clock_2){
        static int a = 0;
        a++;
        ui->la2->setText(QString("time:%1").arg(a));
    }

}

执行结果是两个标签显示的文字在以不同的速度计数

参考:https://www.bilibili.com/video/av20446734?p=30

最后

以上就是顺心黑米为你收集整理的【Qt】事件,自定义控件的全部内容,希望文章能够帮你解决【Qt】事件,自定义控件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部