lv20 QT事件

1 事件模型

2 事件处理

virtual void 	keyPressEvent(QKeyEvent *event)
virtual void 	keyReleaseEvent(QKeyEvent *event)
virtual void 	mouseDoubleClickEvent(QMouseEvent *event)
virtual void 	mouseMoveEvent(QMouseEvent *event)
virtual void 	mousePressEvent(QMouseEvent *event)
virtual void 	mouseReleaseEvent(QMouseEvent *event)
virtual void 	moveEvent(QMoveEvent *event)
virtual void 	paintEvent(QPaintEvent *event)
virtual void 	resizeEvent(QResizeEvent *event)
virtual void 	wheelEvent(QWheelEvent *event)

2.1 事件综合示例

  • mousePressEvent:处理鼠标按下事件,输出鼠标位置信息。
  • mouseMoveEvent:处理鼠标移动事件,输出鼠标位置信息。
  • keyPressEvent:处理键盘按下事件,输出按下的键值。
  • wheelEvent:处理鼠标滚轮事件,输出滚轮滚动距离。
  • timerEvent:处理定时器事件,输出定时器事件信息。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QWheelEvent>

class Widget : public QWidget
{
    Q_OBJECT

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

    void mousePressEvent(QMouseEvent *event)
    {
        qDebug()<<"pressssss: "<<event->pos();

    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        qDebug()<<"moving!"<<event->pos();
    }

    void keyPressEvent(QKeyEvent *event)
    {
        qDebug()<<"key: "<<event->key();
    }

    void wheelEvent(QWheelEvent *event)
    {
        qDebug()<<"wheel: "<<event->delta();
    }

    void timerEvent(QTimerEvent *event)
    {
        qDebug()<<"timer!";
    }
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    startTimer(1000);
}

Widget::~Widget()
{

}

 

2.2 绘图事件

virtual void paintEvent(QPaintEvent *event)
{ 
    if(isDrawing)  {  
	 tempPix = pix;       //双缓冲     
	QPainter pp(&tempPix);  
	painter.drawPixmap(0,0,tempPix);  
    }  
    else {  
	QPainter pp(&pix);  
	painter.drawPixmap(0,0,pix);  
    }  
}

绘制时钟示例 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT  // 使用 Q_OBJECT 宏,以便能够使用 Qt 的信号和槽机制

public:
    Widget(QWidget *parent = 0);  // 构造函数
    ~Widget();  // 析构函数
    void paintEvent(QPaintEvent *event)  // 重载 paintEvent 方法,用于绘制图形
    {
        qDebug()<<"ppppppp";  // 输出调试信息

        QPainter p(this);  // 创建 QPainter 对象并将当前窗口部件作为绘图设备

        p.translate(this->width()/2, this->height()/2);  // 将坐标系平移到窗口中心
        p.drawEllipse(QPoint(0, 0), 100, 100);  // 绘制椭圆
        // p.drawLine(0, 0, 50, 50);  // 注释掉的代码,不会被执行

        p.rotate(i++*10);  // 旋转坐标系
        p.drawLine(0, 0, 50, 50);  // 绘制旋转后的线条
    }

    void timerEvent(QTimerEvent *event)  // 重载 timerEvent 方法,处理定时器事件
    {
        update();  // 更新界面
    }

private:
    int i;  // 用于记录旋转角度的变量
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    i = 0;
    startTimer(1000);
}

Widget::~Widget()
{

}

效果

示例2

用于实现一个简单的画板功能。用户可以在窗口上按下鼠标左键开始绘制线条,拖动鼠标绘制线条,松开鼠标左键结束绘制。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT  // 使用 Q_OBJECT 宏,以便能够使用 Qt 的信号和槽机制

public:
    Widget(QWidget *parent = 0);  // 构造函数
    ~Widget();  // 析构函数

    void mousePressEvent(QMouseEvent *event)  // 处理鼠标按下事件
    {
        startp = event->pos();  // 记录鼠标按下时的位置
    }

    void mouseReleaseEvent(QMouseEvent *event)  // 处理鼠标释放事件
    {
        saveit = true;  // 标记需要保存当前绘制的线条
        update();  // 更新界面
    }

    void mouseMoveEvent(QMouseEvent *event)  // 处理鼠标移动事件
    {
        endp = event->pos();  // 记录鼠标移动时的位置
        update();  // 更新界面
    }

    void paintEvent(QPaintEvent *event)  // 重载 paintEvent 方法,用于绘制图形
    {
        if(saveit)
        {
            QPainter px(pix);  // 创建一个新的 QPainter 对象
            px.drawLine(startp, endp);  // 在 QPixmap 对象上绘制线条,否则下一个线条会消失
            saveit = false;  // 将保存标志复位
        }

        QPainter p(this);  // 创建一个 QPainter 对象,绘制到当前窗口部件上
        p.drawPixmap(0, 0, *pix);  // 将 QPixmap 对象绘制到窗口上
        p.drawLine(startp, endp);  // 实时显示当前绘制的线条
    }

private:
    QPoint startp;  // 起始点坐标
    QPoint endp;  // 终点坐标
    QPixmap *pix;  // 用于保存绘制内容的 QPixmap 对象
    bool saveit;  // 标志是否需要保存当前绘制的线条
};

#endif // WIDGET_H

widget.cpp 

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //创建了一个与窗口大小相同的 QPixmap 对象,并将其填充为白色背景。同时,将保存标志 saveit 初始化为 false
    pix = new QPixmap(this->width(), this->height());
    pix->fill();

    saveit = false;
}

Widget::~Widget()
{

}

 

3 事件过滤

class A:public Qobject{
};

class B:public Qobject{
Public:
	bool eventFilter(Qobject *sender, Qevent *event){
		return QObject::eventFilter(obj, event); 
	}
};
A x;
B y;
x.installeventfilter(&y);

事件示例

一个事件,如先进过快捷键,后经过按钮。最终效果键盘可以切换图片,按钮也可以切换

widget.h 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QFileDialog>
#include <QStringList>
#include <QEvent>
#include <QKeyEvent>

class Widget : public QWidget
{
    Q_OBJECT // 使用 Q_OBJECT 宏,以便能够使用 Qt 的信号和槽机制
public slots:
    void openfiles() // 打开图片文件槽函数
    {
        index = 0; // 初始化索引为0
        files = QFileDialog::getOpenFileNames(); // 获取选择的图片文件列表
        QPixmap pix(files[index]); // 加载第一张图片
        lb->setPixmap(pix); // 在 QLabel 上显示图片
    }

    void showr() // 显示下一张图片槽函数
    {
        if(index+1 < files.length()) // 判断是否还有下一张图片
            index++;
        else
            index = 0; // 循环显示图片

        QPixmap pix(files[index]); // 加载指定索引的图片
        lb->setPixmap(pix); // 在 QLabel 上显示图片
    }

    void showl() // 显示上一张图片槽函数
    {
        if(index-1 >= 0) // 判断是否还有上一张图片
            index--;
        else
            index = files.length()-1; // 循环显示图片

        QPixmap pix(files[index]); // 加载指定索引的图片
        lb->setPixmap(pix); // 在 QLabel 上显示图片
    }

    bool eventFilter(QObject *watched, QEvent *event) // 事件过滤器函数
    {
        lb->setFocus(); // 设置 QLabel 获得焦点
        if(watched == lb) // 如果事件源是 QLabel
        {
            if(event->type() == QEvent::KeyPress) // 如果是键盘按键事件
            {
                QKeyEvent *keyevent = static_cast<QKeyEvent*>(event); // 将事件转换为键盘事件
                if(keyevent->key() == Qt::Key_Left) // 如果按下左箭头键
                    showl(); // 显示上一张图片
                else if(keyevent->key() == Qt::Key_Right) // 如果按下右箭头键
                    showr(); // 显示下一张图片
                return true; // 返回 true 表示事件已处理
            }
        }

        return QWidget::eventFilter(watched, event); // 其他情况交给父类处理
    }
public:
    Widget(QWidget *parent = 0); // 构造函数
    ~Widget(); // 析构函数
private:
    QLabel *lb; // 显示图片的 QLabel 对象
    QPushButton *lbt, *rbt, *openbt; // 左右切换和打开文件的按钮

    QStringList files; // 存储打开的图片文件列表
    int index; // 当前显示图片的索引
};

#endif // WIDGET_H

widget.cpp

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // 创建 QLabel 控件,并设置大小、缩放内容以及获取焦点
    lb = new QLabel;
    lb->setMinimumSize(640, 480);
    lb->setScaledContents(true);
    lb->setFocus();
    lb->installEventFilter(this); // 安装事件过滤器,用于处理键盘事件

    // 创建左右切换和打开文件的按钮,并添加到水平布局中
    lbt = new QPushButton("<");
    rbt = new QPushButton(">");
    openbt = new QPushButton("open");
    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addStretch();
    hbox->addWidget(lbt);
    hbox->addWidget(openbt);
    hbox->addWidget(rbt);
    hbox->addStretch();

    // 创建垂直布局,将 QLabel 和水平布局添加到其中,并设置为 Widget 的布局
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lb);
    vbox->addLayout(hbox);
    setLayout(vbox);

    index = 0; // 初始化索引为0

    // 连接按钮的点击信号与槽函数
    connect(openbt, SIGNAL(clicked(bool)), this, SLOT(openfiles())); // 打开文件按钮
    connect(lbt, SIGNAL(clicked(bool)), this, SLOT(showl())); // 左箭头按钮
    connect(rbt, SIGNAL(clicked(bool)), this, SLOT(showr())); // 右箭头按钮
}

Widget::~Widget()
{
    // 析构函数为空,因为 Qt 会自动管理对象的内存释放
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++笔记(六)--- 静态成员变量/函数(static)

目录 C语言中静态变量 C静态成员变量 C静态成员函数 C语言中静态变量 1.函数内部用static修饰的变量&#xff0c;只能在此函数使用&#xff0c;但所修饰的变量不随函数释放而释放&#xff0c;下次调用时的值仍为上次结束时的值2.static修饰的全局变量只能在其定义的文件使用…

吴恩达《机器学习》学习笔记

本笔记资料来源于 http://www.ai-start.com/ml2014/&#xff0c;该笔记来自于https://blog.csdn.net/dadapongi6/article/details/105668394&#xff0c;看了忘&#xff0c;忘了看&#xff0c;再看一遍。 时间统计&#xff1a;2024.2.29 5个番茄钟&#xff0c;从week1开始&…

智慧城市:打造宜居环境,引领未来可持续发展

随着科技的不断进步与创新&#xff0c;我们的城市正步入一个崭新的时代——智慧城市。智慧城市是指运用信息技术和大数据等现代科技手段&#xff0c;对城市基础设施、公共服务和社会管理进行智能化改造&#xff0c;实现城市各领域的智能化、信息化和高效化。今天&#xff0c;就…

【六袆 - MySQL】MySQL 5.5及更高版本中,InnoDB是新表的默认存储引擎;

InnoDB 这是一个MySQL组件&#xff0c;结合了高性能和事务处理能力&#xff0c;以确保可靠性、健壮性和并发访问。它体现了ACID设计哲学。它作为一个存储引擎存在&#xff0c;处理使用ENGINEINNODB子句创建的或修改的表。请参阅第14章“InnoDB存储引擎”以获取有关架构细节和管…

Prometheus 安装指南

目录 介绍 安装 介绍 Prometheus是一款开源监控系统&#xff0c;适用于容器化和微服务。它使用多维数据模型&#xff0c;支持PromQL查询语言&#xff0c;可以通过多种方式采集数据。具备灵活的告警和通知机制&#xff0c;可集成图形工具创建仪表盘。通过本地存储高效保存时间…

2024-02-29(Flink)

1.Flink原理&#xff08;角色分工&#xff09; 2.Flink执行流程 on yarn版&#xff1a; 3.相关概念 1&#xff09;DataFlow&#xff1a;Flink程序在执行的时候会被映射成一个数据流模型&#xff1b; 2&#xff09;Operator&#xff1a;数据流模型中的每一个操作被称作Operat…

IDC 中搭建 Serverless 应用平台:通过 ACK One 和 Knative 玩转云资源

作者&#xff1a;元毅、庄宇 如何打造云上&#xff08;公共云&#xff09;、云下&#xff08;IDC 数据中心&#xff09;统一的云原生 Serverless 应用平台&#xff0c;首先我们来看一下 ChatGPT 4 会给出什么样的答案&#xff1a; 如何打造云上、云下统一的云原生 Serverless…

Linux Shell脚本练习(三)

1、测试用户名与密码是否正确。 2、输出1-1000内的素数。 3、对 100 以内的所有正整数相加求和(1234...100)。 4、输出9*9 乘法表。 5、编写脚本,显示进度条。 、 6、输入三个数并进行升序排序

PVE开启IPV6

echo "net.ipv6.conf.all.accept_ra2net.ipv6.conf.default.accept_ra2net.ipv6.conf.vmbr0.accept_ra2net.ipv6.conf.all.autoconf2net.ipv6.conf.default.autoconf2net.ipv6.conf.vmbr0.autoconf2" > /etc/sysctl.conf然后执行 sysctl -p最后再查询IP地址即可看…

技术实践|百度安全「大模型内容安全」高级攻击风险评测

1、引子 2023年10月16日&#xff0c;OWASP发布了《OWASP Top 10 for LLM Applications》&#xff0c;这对于新兴的大语言模型安全领域&#xff0c;可谓一份纲领性的重要报告。 OWASP是开放式Web应用程序安全项目&#xff08;Open Web Application Security Project&#xff0…

基于springboot+vue的编程训练系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Web自动化测试平台开发---Automated_platform

一、项目简介 历时一个假期&#xff0c;Automated_platform 第一版完工&#xff0c;是一款基于po模式的自动化测试平台,采用后端技术为DjangoceleryRabbitMQmysql 配置mysql数据库&#xff0c;进行数据迁移后&#xff0c;运行项目后&#xff0c;即可成功访问http://127.0.0.1:8…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

SpringCloud Alibaba(保姆级入门及操作)

第一章 微服务概念 1.0 科普一些术语 科普一下项目开发过程中常出现的术语,方便后续内容的理解。 **服务器:**分软件与硬件,软件:类型tomcat这种跑项目的程序, 硬件:用来部署项目的电脑(一般性能比个人电脑好) **服务:**操作系统上术语:一个程序,开发中术语:一个…

nm readelf objdump objcopy 命令之间的关系

nm readelf objdump objcopy 命令之间的关系 在解析可执行文件和链接库时&#xff0c;经常涉及到上述命令&#xff0c;但之前一直没有梳理清楚这几个命令之间的关系。如下整理了 概述 objdump, readelf, nm, 和 objcopy 是 GNU Binutils 套件的一部分&#xff0c;它们用于处…

Opencv基础与学习路线

Opencv Opencv每一篇目具体&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 Opencv(3)详解霍夫变换 Opencv(4)详解轮廓 Opencv(5)平滑处理 具体Opencv相关demo代码欢迎访问我的github仓库&#xff08;包含python和c代码&#xff09; demo代码 文章目录 Opencv一…

数学建模【分类模型】

一、分类模型简介 本篇将介绍分类模型。对于二分类模型&#xff0c;我们将介绍逻辑回归&#xff08;logistic regression&#xff09;和Fisher线性判别分析两种分类算法&#xff1b;对于多分类模型&#xff0c;我们将简单介绍SPSS中的多分类线性判别分析和多分类逻辑回归。 分…

2024.2.29

TCP通信模型 代码&#xff1a; #include <myhead.h> #define SER_IP "192.168.153.128"//服务器ip #define SER_PORT 8080//服务器端口号int main(int argc, const char *argv[]) {//创建用于监听的套接字int sfd-1;sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd…

C#使用iText7给PDF文档添加书签

上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档&#xff0c;但是没有书签&#xff0c;八百多页的内容查找和跳转都不方便&#xff0c;本文学习和使用iText7给PDF文档添加多级书签。   添加多级书签分为两大步骤&#xff1a;1&#xff…

探索反距离加权的深度:一种用于地理数据分析的空间插值方法

目录 一、介绍 二、方法论 三、应用 四、优势 五、局限性 六、代码 七、结论 一、介绍 反距离加权 &#xff08;IDW&#xff09; 是一种广泛用于地理信息系统 &#xff08;GIS&#xff09; 和环境科学的空间插值技术&#xff0c;用于根据附近位置的值估计任何位置的缺失值。它的…