Qt_事件

事件

什么是事件

主要是鼠标点击,键盘响应,进入离开什么的,这些事件其实是QWidget的一些虚函数,我们要做的就是继承QWidget或其子类,然后重写这些虚函数,我们可以在帮助文档里找QWidget的虚函数来查看这些事件在这里插入图片描述

怎么用

一般我们是编辑组件的事件响应,但是Qt自带的那些组件我们没法编辑,所以这里我们要新建一个C++类继承QWidget或其子类,然后用这个,或者我们可以将ui里的组件提升为我们自己写的类(右键组件然后选择提升为),然后我们把我们想要的事件复制到头文件然后在源文件里实现就行了。

举例

键盘移动图片,滑条控制速度(没有实现,一动滑条,图片的键盘响应好像就失效了),鼠标可以拖动图片,关闭后滑条值保存
在这里插入图片描述
代码如下
先是总体
在这里插入图片描述

mytoolbutton.h

#ifndef MYTOOLBAR_H
#define MYTOOLBAR_H

#include <QToolButton>
#include<QPoint>
#include<QMouseEvent>
#include<QKeyEvent>//要添头文件

class MyToolButton : public QToolButton//继承QToolButton
{
    Q_OBJECT
public:
    explicit MyToolButton(QWidget *parent = nullptr);
//将帮助文档里需要的事件函数复制到这里
 void
    keyPressEvent(QKeyEvent *event);

  void
    mouseMoveEvent(QMouseEvent *event);

 void
    mousePressEvent(QMouseEvent *event);
    QPoint point;//存点击后鼠标的坐标
    double speed=30;//默认的移动速度
signals:

};

#endif // MYTOOLBAR_H

mytoolbutton.cpp

#include "mytoolbutton.h"
#include<QDebug>
MyToolButton::MyToolButton(QWidget *parent) : QToolButton(parent)
{

}

void MyToolButton::keyPressEvent(QKeyEvent *event)
{
switch(event->key())//关注key()和Qt作用域下的那些键的宏
{
case Qt::Key_W : case Qt::Key_Up :
    this->move(this->pos()+QPoint(0,-1*speed));
        break;
case Qt::Key_S : case Qt::Key_Down :
    this->move(this->pos()+QPoint(0,1*speed));
        break;
case Qt::Key_D : case Qt::Key_Right :
    this->move(this->pos()+QPoint(1*speed,0));
        break;
case Qt::Key_A : case Qt::Key_Left :
    this->move(this->pos()+QPoint(-1*speed,0));
        break;
}
}

void MyToolButton::mouseMoveEvent(QMouseEvent *event)//这个事件默认只有在点击时移动才会出现,所以我们再写一个鼠标点击响应来保存点击时的鼠标坐标
{
QPoint delta=event->pos()-point;
this->move(this->pos()+delta);
}

void MyToolButton::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
        qDebug()<<"left clicked tianyi";
}
else if(event->button()==Qt::RightButton)
{
       qDebug()<<"right clicked tianyi";
}
point=event->pos();//保存点击时的坐标,为后面图片移动做准备

}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QSettings>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_verticalSlider_valueChanged(int value);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->ui->verticalSlider->setMaximum(100);
    QSettings setting("config.ini");
    ui->verticalSlider->setValue(setting.value("volume").toInt());//读取配置文件
}

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


void Widget::on_verticalSlider_valueChanged(int value)
{
    ui->label->setText("speed:"+QString::number(value)+"%");
QSettings settingfile("config.ini");//QSetting对象可以实现一个查字典一样的效果,我们可以给每个关键字存一个值,用的时候调用value函数(注意返回结果是字符串)
settingfile.setValue("volume",value);
qDebug()<<value;
this->ui->tianyi->speed=value;
qDebug()<<this->ui->tianyi->speed;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值