一、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);
}