Qt事件(包括鼠标、按键、绘图事件)、软键盘的制作(QT八)

8 篇文章 2 订阅

一、Qt事件

Qt所有的动作都是由事件驱动的

鼠标事件:

操作系统获取鼠标数据 -> Qt底层 ->QApplication把事件发送 -> 入队列/直接派发 -> QCoreApplication::notify -> QObject::event -> QWidget::event -> EventWin::event

发送事件函数

bool QCoreApplication::notify(QObject *receiver, QEvent *event)
//发送的事件入队列
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority) 
//发送的事件直接派发
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)

二、鼠标事件QMouseEvent

virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);

鼠标坐标–左右键

QPoint pos = event->pos();//鼠标当前坐标
event->button() //鼠标事件是按下了那个键 Qt::RightButton(右键)Qt::LeftButton(左键)

三、按键事件QKeyEvent

virtual void keyPressEvent(QKeyEvent *event);
virtual void keyReleaseEvent(QKeyEvent *event);

按键键值,组合键

if(event->modifiers() == (Qt::AltModifier|Qt::ControlModifier) ) //判断是否同时按下了alt和ctrl
    if(event->key() == Qt::Key_Return) //笔记本上的enter是key_return

四、绘图事件—自定义控件 QPaintEvent

virtual void paintEvent(QPaintEvent *event);  绘图事件函数

当界面有刷新, 或者是调用update(),事件就会发生就是paintEvent(QPaintEvent *event)函数会被调用

画线程

QPainter painter(this);//创建一个绘图对象,后期绘制在this上
QPen pen = painter.pen();//获取工具中的画笔
pen.setWidth(5);//线宽
pen.setColor(Qt::green);//线颜色
pen.setCapStyle(Qt::RoundCap);//线头圆角 SquareCap锯齿状 RoundCap圆角 FlatCap尖角
painter.setPen(pen);
painter.drawLine(x,y,200,200);//绘制直线

画圆

pen.setWidth(10);//线宽
pen.setColor(Qt::blue);//线颜色
pen.setCapStyle(Qt::RoundCap);
painter.setPen(pen);
painter.drawEllipse(QPoint(200,200),150,150);

画文字

painter.drawText(x,y,"hello");

绘图

//绘制图片
painter.drawImage(QPointF(300,300),QImage(":/cold.png"));
QImage image(":/cold.png");
painter.drawImage(QRectF(qrand()%500,qrand()%500,50,50),image, image.rect());
//drawImage(要画的图片尺寸位置, 图片,  图片原先的尺寸位置)
//QRectF(x坐标,y坐标, 宽,高)

通过绘图事件封装控件

pen.setWidth(15);//线宽
pen.setColor(Qt::green);//线颜色
pen.setCapStyle(Qt::RoundCap);//线头圆角
painter.setPen(pen);
painter.translate(QPoint(150,150));//移动原点
painter.rotate(hr);//坐标系旋转33度
painter.drawLine(0,0,0,-50);

五、自定义事件—软件盘

设计如下样式键盘
在这里插入图片描述

事件过滤器

#include <QMainWindow>
namespace Ui {
class SKTest;
}
class SKTest : public QMainWindow
{
    Q_OBJECT
public:
    explicit SKTest(QWidget *parent = nullptr);
    ~SKTest();
    bool event(QEvent *e);
    bool eventFilter(QObject* obj, QEvent* e);//事件过滤
private:
    Ui::SKTest *ui;
};
#include "sktest.h"
#include "ui_sktest.h"
#include <QDebug>
SKTest::SKTest(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SKTest)
{
    ui->setupUi(this);
    //安装过滤器--只有安装事件过滤器的控件对应事件才会经过过滤器函数
    ui->lineEdit->installEventFilter(this);
    ui->lineEdit_2->installEventFilter(this);
    ui->textBrowser->installEventFilter(this);
}

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

bool SKTest::event(QEvent *e)
{
    return QMainWindow::event(e);
}

bool SKTest::eventFilter(QObject *obj, QEvent *e)
{
    qDebug()<<obj->objectName()<<e->type();//输出对象名,事件类型
    //判断是否焦点进入,并且是obj是QLineEidt的派生类对象
    if(e->type() == QEvent::FocusIn  && obj->inherits("QLineEdit"))
    {
        ui->widget->show();
    }
    return QMainWindow::eventFilter(obj, e);
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
9.1事件机制与原理分析 9.1.1 什么是Qt事件驱动?         我们在写Qt工程类项目的时候都会发现,主程序里面都有这么一段代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 有点抽象,Qt进行了封装        实际上a.exec()便是Qt程序进入事件消息循环, 9.1.2 图形界面应用程序的消息处理模型 回调、os的魔抓windows、linux,从用户层到 内核层,如何管理进程、线程、 Os如何处理、底层机制 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的  系统内核的消息通过事件处理转变成QT的信号 9.1.3 Qt中的事件处理 (1)在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.              事件处理的核心包括事件①产生、②分发、③接受和处理 ①事件的产生 谁来产生事件? 最容易想到的是我们的输入设备,比如键盘、鼠标产生的 keyPressEvent,keyReleaseEvent, mousePressEvent,mouseReleaseEvent事件 (被封装成QMouseEvent和QKeyEvent)。 ②Qt事件的分发 谁来负责分发事件? 对于non-GUIQt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver.  对于Qt GUI程序,由QApplication来负责   ③事件的接受和处理 谁来接受和处理事件? 答案是QObject。 类是整个Qt对象模型的心脏,事件处理机制是QObject三大职责( 内存管理、内省intropection、事件处理制)之一。 任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。 9.1.4 QObject的内省机制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java.L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值