QT----第三天,Visio stdio自定义封装控件,鼠标事件,定时器,事件分发器过滤器,绘图事件

news2024/12/28 2:50:25

目录

  • 第三天
    • 1 自定义控件封装
    • 2 QT鼠标事件
    • 3 定时器
    • 4 event事件分发器
    • 5 事件过滤器
    • 6 绘图事件Qpainter

源码:CPP学习代码

第三天

1 自定义控件封装

新建一个QT widgetclass,同时生成ui,h,cpp文件

在这里插入图片描述
在smallWidget.ui里添加上你想要的控件并调试大小

在这里插入图片描述
回到mainwidget.ui,拖入一个widget(因为我们封装的也是widget),右击提升为,输入名字(名字一定要写对)。

在这里插入图片描述

此时还需要进入mainWidget.h,按住ALT进入"ui_mainWidget.h",修改smallWidget的<>为引号“”(“”是本地的头文件),这时候运行就能看到我们的控件了。

在这里插入图片描述

在smallwidget.cpp里编写代码,让这两个控件QspinxBox和QSilder联系起来,查找手册里的信号和槽,没有就查找父类

//QspinxBox移动,QSlider跟着移动 查手册,没有就查父类
connect(ui.spinBox,&QSpinBox::valueChanged,ui.horizontalSlider,&QSlider::setValue);
//QSilder移动,QspinxBox跟着移动
connect(ui.horizontalSlider, &QSlider::sliderMoved,ui.spinBox, &QSpinBox::setValue);

再添加两个按钮,一个显示值,一个让值变成一半

在smallwidget头文件里定义两个函数,并到cpp里实现

//设置值
void setNumber(int value);
//得到值
int getNumber();

void smallWidget::setNumber(int value)
{
 //设置值
 ui.spinBox->setValue(value);
}

int smallWidget::getNumber()
{
 //返回值
 return ui.spinBox->value();
}

再到mainwidget.cpp里实现信号的连接,由于smallwi是连接到mainwi里边的widget,所以可以通过ui来访问widget来得到我们定义的函数

//点击获取值
connect(ui.btn1,&QPushButton::clicked,[=](){
   qDebug()<< ui.widget->getNumber();
});
//点击设置值
connect(ui.btn2, &QPushButton::clicked, [=]() {
    ui.widget->setNumber(50);
 qDebug() << ui.widget->getNumber();
});

在这里插入图片描述

2 QT鼠标事件

Enterevent,鼠标进入这个控件就会被捕捉。

不想用ui,只想用自定义事件来捕捉鼠标,就新建一个QTclass,只要h和cpp。查询手册鼠标进入和鼠标退出的函数,直接复制。

//鼠标进入
void enterEvent(QEnterEvent* event);

//鼠标离开
void leaveEvent(QEvent* event);

void mylabel::enterEvent(QEnterEvent * event)
{
 qDebug() <<"鼠标进入了";
}

void mylabel::leaveEvent(QEvent* event)
{
 qDebug() << "鼠标离开了";
}

在ui中拖入label,因为我们使用的Qlabel,所以这个mylabel.h和cpp应该继承QLabel,更改以下三处

在这里插入图片描述

然后跟上边一样将这个更主界面连接起来,ui界面右键提升为,输入名字,然后修改ui_mainWidget.h里边将mylabely的引用改为“”。此时运行就会发现能够捕捉到鼠标

在这里插入图片描述

在查询手册,QLabel还有很多对鼠标的操作,我们直接复制来实现,可以在点击时实现输出,移动时输出需要更改因为移动是一个过程。Qstring格式化输出Qstring(%1 %2).arg(参数1).arg(参数2)

在这里插入图片描述

void mylabel::mousePressEvent(QMouseEvent* ev)
{
 //QT6很多都删了但是还能使用,不推荐
 if(ev->button() == Qt::LeftButton)
 {
  QString str = QString("鼠标按下 x =%1  y =%2 globalx=%3 ").arg(ev->pos().x()).arg(ev->pos().y()).arg(ev->globalPosition().toPoint().x());
  qDebug() << str;
 }
}

void mylabel::mouseReleaseEvent(QMouseEvent* ev)
{
 if (ev->button() == Qt::LeftButton)
 {
  qDebug() << "鼠标释放";
 }
}

void mylabel::mouseMoveEvent(QMouseEvent* ev)
{
 //因为移动是个过程,所以直接==不能够触发,这边用的是buttons,里边包含了三种状态,使用与操作符,当状态和Leftbutton相同时触发
 if (ev->button() & Qt::LeftButton)
 { 
  qDebug() << "鼠标移动111";
 }
}

在构造函数里添加上鼠标追踪,就不用判断是否点击或者移动来打印信息,会实时打印

mylabel::mylabel(QWidget*parent)
 : QLabel(parent)
{
 //设置鼠标追踪,默认false
 setMouseTracking(true);
}

3 定时器

使用时间间隔来做出动作,可以让数加一。首先得在头文件里重写定时器事件timerEvent,可以定义定时器的id,startimer启动定时器,让不同的控件有不同的时间间隔,通过timerId()来指定对应的计时器。第二种方式,直接使用QTimer新建一个对象,使用timeout信号连接即可。

//.h
//重写定时器事件
void timerEvent(QTimerEvent *event);
 
int id1;//定时器的id
int id2;//定时器的id

//.cpp
#include <QTimer>
mainWidget::mainWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    //启动定时器
    id1 = startTimer(1000);//单位毫秒,每隔一秒调用函数

    id2 = startTimer(2000);//单位毫秒,每隔2秒调用函数

 //定时器的第二种方式
 QTimer* timer = new QTimer(this);
 //启动定时器
 timer->start(500);

 connect(timer,&QTimer::timeout,[=](){
  static int num2 = 1;
  ui.label3->setText(QString::number(num2++));
 });
  //点击按钮暂停

  connect(ui.btn1,&QPushButton::clicked,\[=\](){

    timer->stop();
  });
}

mainWidget::~mainWidget()
{}

void mainWidget::timerEvent(QTimerEvent * event)
{

 if (event->timerId() == id1)
 {
  static int num = 1;
  ui.label2->setText(QString::number(num++));
 }
 //   //两秒跳一次
 //if (event->timerId() == id2)
 //{
 //        static int num2 = 1;
 //        ui.label3->setText(QString::number(num2++));
 //}
    
}

4 event事件分发器

每个发出的响应都会经过这个事件分发器,如果返回true就直接截胡了,相当于你点击鼠标是不触发鼠标点击而触发你定义的事件
在这里插入图片描述

type里边有很多的事件
在这里插入图片描述

如果返回值是true代表用户需要拦截处理这个事件不向下分发

//.h
//通过Event事件分发器拦截鼠标按下事件
bool event(QEvent *e);

//.cpp
bool mylabel::event(QEvent* e)
{
 //如果是鼠标按下,在event事件分发中做拦截操作
 if (e->type() == QEvent::MouseButtonPress)
 {
  //类型转换,e是ev的父类
  QMouseEvent* ev = static_cast<QMouseEvent*>(e);
  QString str = QString("鼠标按下222 x =%1  y =%2 globalx=%3 ").arg(ev->pos().x()).arg(ev->pos().y()).arg(ev->globalPosition().toPoint().x());
  qDebug() << str;

  return true;//代表用户自己处理这个事件
 }
 //其他事件交给父类处理,默认处理
 return QLabel::event(e);
}

5 事件过滤器

相当于拦截了事件分发器。使用过程两个步骤,1、给控件安装事件过滤器,2、重写eventfilter事件

在这里插入图片描述

//.h
 //在widget中重写eventfilter事件
 bool eventFilter(QObject *watched, QEvent *event);

//.cpp
//给label1安装事件过滤器
//1、构造函数里安装事件过滤器
ui.label1->installEventFilter(this);

//2、重写事件,obj就是控件
bool mainWidget::eventFilter(QObject* watched, QEvent* event)
{
 if (watched == ui.label1)
 {
  if (event->type() == QEvent::MouseButtonPress)
  {
   //类型转换,e是ev的父类
   QMouseEvent* ev = static_cast<QMouseEvent*>(event);
   QString str = QString("事件过滤器鼠标按下 x =%1  y =%2 globalx=%3 ").arg(ev->pos().x()).arg(ev->pos().y()).arg(ev->globalPosition().toPoint().x());
   qDebug() << str;
  }
 }
 //默认交给父类处理
 return QWidget::eventFilter(watched,event);
}

6 绘图事件Qpainter

整体比较简单。只需要重写panitEvent事件,并且声明画家对象,笔刷画笔也只需要先声明对象。

//.h
//绘图事件
void paintEvent(QPaintEvent *);

//.cpp
void mainWidget::paintEvent(QPaintEvent*)
{
    //实例化画家对象,this指定的是绘图设备
    QPainter painter(this);
    //设置画笔
    QPen pen(QColor(255,0,0));
    pen.setWidth(3);//宽度
    pen.setStyle(Qt::DotLine);//风格
    //使用画笔,红色
    painter.setPen(pen);

    //画刷,会填充封闭的图形
    QBrush brush(QColor(0,255,0));
    painter.setBrush(brush);
    //画线
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    //画圆
    painter.drawEllipse(QPoint(100,100),50,50);
    //画矩形
    painter.drawRect(50,50,50,50);
    //画文字
    painter.drawText(QRect(10,200,150,50),"学习");
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下MySQL的安装部署

MySQL数据库存在多种版本&#xff0c;不同的版本在不同的平台上&#xff08;OS&#xff0c;也就是操作系统上&#xff09;安装方式可能有所不同&#xff0c;因此安装时一定要参数官方文档进行安装。 MySQL :: MySQL Documentation 选择需要的MySQL官方提供的不同版本&#xff0…

【谭浩强C语言】导言-C知识点汇总

一、初衷 C语言基本是各大院校工科必修课&#xff0c;C语言也是单片机、嵌入式系统的基础开发语言&#xff0c;很多老师们都各显神通的把C语言精讲地很到位&#xff0c;咱们CSDN的技能树也提供了很棒的学习平台。那么&#xff0c;为什么还是打算开个专栏再整理整理呢&#xff…

Kubernetes实战(十四)-k8s高可用集群扩容master节点

1 单master集群和多master节点集群方案 1.1 单Master集群 k8s 集群是由一组运行 k8s 的节点组成的&#xff0c;节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色&#xff1a;master 和 node。 master 节点&#xff1a;master 节点负责控制和管理整个集群…

对自己的博客网站进行DOS攻击

对自己的博客网站进行DOS攻击 先说明一点,别对别人的网站进行ddos/dos攻击(dos攻击一般短时间攻击不下来),这是违法的,很多都有自动报警机制,本篇博客仅用于学习,请勿用于非法用途 安装kaili Linux 进入KALI官网,下载iso镜像文件 vmware新建虚拟机,选择自定义 点击下一步 …

LeetCode2961双模幂运算(相关话题:快速幂)

题目描述 给你一个下标从 0 开始的二维数组 variables &#xff0c;其中 variables[i] [ai, bi, ci, mi]&#xff0c;以及一个整数 target 。 如果满足以下公式&#xff0c;则下标 i 是 好下标&#xff1a; 返回一个由 好下标 组成的数组&#xff0c;顺序不限 。 示例 &…

《面向机器学习的数据标注规程》摘录

说明&#xff1a;本文使用的标准是2019年的团体标准&#xff0c;最新的国家标准已在2023年发布。 3 术语和定义 3.2 标签 label 标识数据的特征、类别和属性等。 3.4 数据标注员 data labeler 对待标注数据进行整理、纠错、标记和批注等操作的工作人员。 【批注】按照定义…

加权准确率WA,未加权平均召回率UAR和未加权UF1

加权准确率WA&#xff0c;未加权平均召回率UAR和未加权UF1 1.加权准确率WA&#xff0c;未加权平均召回率UAR和未加权UF12.参考链接 1.加权准确率WA&#xff0c;未加权平均召回率UAR和未加权UF1 from sklearn.metrics import classification_report from sklearn.metrics impor…

响应者链概述

响应者链 iOS事件的3大类型 Touch Events(触摸事件)Motion Events(运动事件&#xff0c;比如重力感应和摇一摇等)Remote Events(远程事件&#xff0c;比如用耳机上得按键来控制手机) 触摸事件 处理触摸事件的两个步骤 寻找事件的最佳响应者事件的响应在响应链中的传递 寻…

MAC上配置esp32的开发环境

1、安装Thonny. 2、你需要一块ESP32开发板。MicroPython支持ESP32芯片本身&#xff0c;从而可运行于任何一块搭载ESP32 芯片的开发板上。改板子的主要特征在于GPIO针脚是连接外界的&#xff0c;并且它包含了一个内置的 USB串口转换器&#xff0c;该转换器可以使你的电脑通过UAR…

springboot——定时任务、异步任务

springboot——定时任务、异步任务 一、定时任务1、创建一个定时任务、时间配置文件2、springboot主程序开启定时任务 EnableScheduling3、使用 Scheduled 注解 二、定时任务、异步执行。1、springboot主程序开启异步任务 EnableAsync2、方法上增加 Async 注解&#xff0c;标识…

谷歌浏览器标签页显示内存使用率

Chrome 桌面浏览器的新更新现在可让您查看每个标签页占用了多少内存&#xff0c;这可以帮助您确定哪些标签页占用了多少内存&#xff0c;网站正在减慢您笔记本电脑的速度。 今年早些时候在 Google Chrome 中引入内存节省程序之后&#xff0c;Google 又发布了一项功能&#xff…

深入理解CI/CD与Docker集成:自动化构建和部署的完整指南

在当今软件开发的快节奏环境中&#xff0c;自动化构建和部署是实现敏捷开发和DevOps实践的关键。Docker容器技术为这一过程引入了更高的灵活性和一致性。本文将深入研究如何将持续集成/持续部署&#xff08;CI/CD&#xff09;与Docker集成&#xff0c;提供更详细、实用的示例代…

直接插入排序_希尔排序

文章目录 直接插入排序原理步骤视频演示代码实现特性 希尔排序原理步骤图像演示代码实现希尔排序的分析特性 直接插入排序和希尔排序的比较 直接插入排序 直接插入排序&#xff08;Straight InsertionSort&#xff09;是一种最简单的排序方法&#xff0c;其基本操作是将一条记录…

智能优化算法应用:基于动物迁徙算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于动物迁徙算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于动物迁徙算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.动物迁徙算法4.实验参数设定5.算法结果6.…

MinGW编译Python至pyd踩坑整理

title: MinGW编译Python至pyd踩坑整理 tags: [Python,CC] categories: [开发记录,Python] date: 2023-12-12 13:48:20 description: sidebar: [‘toc’, ‘related’,‘recent’] 注意需要魔法 用scoop自动安装配置MinGw 需要魔法&#xff0c;不需要手动配置mingw scoop in…

FreeRDP WebConnect Url 任意文件读取漏洞复现

0x01 产品简介 FreeRDP-WebConnect 是一个开源HTML5代理&#xff0c;它提供对使用RDP的任何Windows服务器和工作站的Web访问。 0x02 漏洞概述 FreeRDP WebConnect Url 接口处存在任意文件读取漏洞&#xff0c;攻击者可通过该漏洞读取系统重要文件&#xff08;如数据库配置文…

自动驾驶学习笔记(十九)——Planning模块

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 Planning作用 Planning内容 Plannin…

【深度强化学习】DQN, Double DQN, Dueling DQN

DQN 更新方程 Q θ ( s t , a t ) ← Q θ ( s t , a t ) α ( r t γ max ⁡ a ′ Q θ ( s t 1 , a ′ ) − Q θ ( s t , a t ) ) Q_\theta(s_t,a_t) \leftarrow Q_\theta(s_t,a_t) \alpha \left( r_t \gamma \red{\max_{a} Q_\theta(s_{t1},a)} - Q_{\theta}(s_t,a_t…

Cmake基础(4)

这篇文章在上一篇的基础之上应用多文件&#xff0c;即一个项目中添加多个文件 文章目录 GLOBsource_group排除文件 上一篇文章的cmake基本不变&#xff0c;这篇文章的重点在于add_executable(${EXECUTABLE_NAME} main.cpp) GLOB file(GLOB cpp_list ${CMAKE_CURRENT_SOURCE_…

继电器模块的使用(超详细)

继电器模块的工作原理 继电器&#xff08;Relay&#xff09;是一种电控开关&#xff0c;其工作原理基于电磁感应。继电器通常包括一个电磁线圈和一组触点。 以下是继电器模块的基本工作原理&#xff1a; 电磁线圈&#xff1a; 继电器内部包含一个电磁线圈&#xff0c;通常由绕制…