绘图示例---QT手动调用绘图事件,按钮控制图片

效果:

点击 “移动” 图片向右移动20,点击 “西理win嘛” 图片每秒向右移动20

QQ录屏20231212164128

下面时代码详解:

注意使用UI和代码实现按钮的不同

UI:

    ui->pushButton->setGeometry(windowWidth-105, windowHeight-25, 100, 20);

使用ui的话,引用按钮变量名字时要在前面  ui->

代码:

//  QPushButton *pushButton2= new QPushButton("西理win", this);pushButton2= new QPushButton("西理win", this) ;

为了使按钮保持在屏幕的右下角,不受窗口大小的影响,你可以在 Widget 构造函数中设置按钮的固定位置。在 QPushButtonsetGeometry 函数中,将按钮的位置固定在右下角。

如果你希望在窗口大小变化时更新按钮的位置,你需要在窗口大小变化事件中处理按钮的位置。在 Qt 中,可以通过重新实现 resizeEvent 函数来捕捉窗口大小变化事件。

在Qt中,你可以使用 mapTomapFrom 系列函数来获取控件在窗口中的坐标。

这里,mapTo 函数将按钮的相对坐标 (0, 0) 映射到窗口坐标系中,然后通过 x()y() 函数获取相应的坐标。

 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();//绘图事件void paintEvent(QPaintEvent *);void resizeEvent(QResizeEvent *);int posX = 0;int id1; //定时器1的唯一标示QPushButton *pushButton2;private:Ui::Widget *ui;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPushButton>
#include <QWidget>
#include <QDebug>
#include <QResizeEvent>
#include <QTimer> //定时器类
//#include <QCursor>
//#include <QMouseEvent>
//#include <QGuiApplication>
//#include <QScreen>
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("lddbh");
//  this->setFixedSize(600,400);/“移动”按钮的设置以及连接/////    ui->pushButton->move(10,10);//点击移动按钮,移动图片connect(ui->pushButton,&QPushButton::clicked,[=](){posX+=20;//如果要手动调用绘图事件 用update更新update();});/“西理win按钮的设置以及连接”/////定时器第二种方式QTimer * timer = new QTimer(this);//启动定时器timer->start(1000);//  QPushButton * btn = new QPushButton;
//  //btn->show(); //show以顶层方式弹出窗口控件
//  //让btn对象 依赖在 myWidget窗口中
//  btn->setParent(this);//  QPushButton *pushButton2= new QPushButton("西理win", this);pushButton2= new QPushButton("西理win", this) ;//改变文本pushButton2->setText("西理win嘛");//设置初始位置
//  pushButton2->move(50,50);//定义按钮的长和宽
//  int buttonWidth = 50;
//  int buttonHeight = 20;//获取电脑屏幕的长宽
//  int screenWidth = QGuiApplication::primaryScreen()->geometry().width(); // 获取主屏幕宽度
//  int screenHeight = QGuiApplication::primaryScreen()->geometry().height(); // 获取主屏幕高度//获取窗口的长宽
//  int windowWidth = this->width(); // 获取窗口宽度
//  int windowHeight = this->height(); // 获取窗口高度//打印调试
//  qDebug() << windowWidth;
//  qDebug() << windowHeight;//放到这里不行,得放到resizeEvent函数里面才行,具体解释下面有
//  pushButton2->setGeometry(windowWidth/2, windowHeight/2, buttonWidth, buttonHeight);
//  pushButton2->move(windowWidth/2,windowHeight/2);//点击按钮,打开定时器,图片每隔一秒右移20connect(pushButton2,&QPushButton::clicked,[=](){timer->start();connect(timer,&QTimer::timeout,[=](){posX+=20;//如果要手动调用绘图事件 用update更新update();});});
}/使“西理win”按钮的位置始终保持在中央///
void Widget::resizeEvent(QResizeEvent *event)
{// 调用基类的resizeEvent以确保正常的处理,调试发现这行可要可不要QWidget::resizeEvent(event);
//  int screenWidth = QGuiApplication::primaryScreen()->geometry().width(); // 获取主屏幕宽度
//  int screenHeight = QGuiApplication::primaryScreen()->geometry().height(); // 获取主屏幕高度// 获取新的窗口宽度和高度int windowWidth = this->width();qDebug() << windowWidth;int windowHeight = this->height();qDebug() << windowHeight;// 更新按钮的位置pushButton2->setGeometry(windowWidth / 2, windowHeight / 2, 100, 20);ui->pushButton->setGeometry(windowWidth-105, windowHeight-25, 100, 20);QPoint buttonPos =ui->pushButton->mapTo(this, QPoint(0, 0));int buttonX = buttonPos.x();int buttonY = buttonPos.y();qDebug() << buttonX;qDebug() << buttonY;
}void Widget:: paintEvent(QPaintEvent *)
{
//    //    //实例化画家对象  this指定的是绘图设备
//        QPainter painter(this);//    //    //设置画笔
//        QPen pen(QColor(0,20,255));
//    //    //设置画笔宽度
//        pen.setWidth(3);
//    //    //设置画笔风格
//        pen.setStyle(Qt::DashDotDotLine);
//    //    //让画家 使用这个笔
//        painter.setPen(pen);//    //    //设置画刷
//        QBrush brush(Qt::red);
//    //    //设置画刷风格
//        brush.setStyle(Qt::DiagCrossPattern);
//    //    //让画家使用画刷
//        painter.setBrush(brush);//    //    //画线
//        painter.drawLine(QPoint(0,0) , QPoint(100,100));//    //    //画圆 椭圆
//        painter.drawEllipse( QPoint(100,100) , 50,50);//    //    //画矩形
//        painter.drawRect(QRect(20,20,50,50));//    //    //画文字
//        painter.drawText(QRect(10,200,150,50) , "好好学习,天天向上");//高级设置 /////        QPainter painter(this);painter.drawEllipse(QPoint(100,50) , 50,50);//    //设置 抗锯齿能力  效率较低painter.setRenderHint(QPainter::Antialiasing);painter.drawEllipse(QPoint(200,50) , 50,50);//        //画矩形
//        painter.drawRect(QRect(20,20,50,50));//    //    //移动画家
//        painter.translate(100,0);//    //    //保存画家状态
//        painter.save();//        painter.drawRect(QRect(20,20,50,50));//        painter.translate(100,0);//    //    //还原画家保存状态
//        painter.restore();//        painter.drawRect(QRect(20,20,50,50));/利用画家 画资源图片 ///QPainter painter(this);// 加载原始图片QPixmap originalPixmap(":/image/kk.jpg");// 计算缩放比例,使图片适应窗口大小QSize scaledSize = originalPixmap.size().scaled(this->size(), Qt::KeepAspectRatio);// 如果超出屏幕,从0开始if (posX >= this->width()) {posX = 0;}// 将图片进行缩放并绘制在窗口上painter.drawPixmap(QRect(posX, 0, scaledSize.width(), scaledSize.height()), originalPixmap);
}Widget::~Widget()
{delete ui;
}

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

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

相关文章

【思考】只有实对称矩阵才能正交对角化吗?【矩阵的合同】

1&#xff1a;命题改写&#xff08;A可以正交对角化&#xff09; 2&#xff1a;左乘Q右乘Q逆&#xff08;Q转置&#xff09; 3&#xff1a;取转置 4&#xff1a;得证 总结 可以看到&#xff0c;矩阵如果可以正交对角化&#xff0c;那么一定是实对称矩阵。 另外&#xff0c;这…

【期末复习向】长江后浪推前浪之ChatGPT概述

参考文章&#xff1a;GPT系列模型技术路径演进-CSDN博客 这篇文章讲了之前称霸NLP领域的预训练模型bert&#xff0c;它是基于预训练理念&#xff0c;采用完形填空和下一句预测任务2个预训练任务完成特征的提取。当时很多的特定领域的NLP任务&#xff08;如情感分类&#xff0c…

LLM之Agent(六)| 使用AutoGen、LangChian、RAG以及函数调用构建超级对话系统

本文我们将尝试AutoGen集成函数调用功能。函数调用最早出现在Open AI API中&#xff0c;它允许用户调用外部API来增强系统的整体功能和效率。例如&#xff0c;在对话过程中根据需要调用天气API。 函数调用和Agent有各种组合&#xff0c;在这里我们将通过函数调用调用RAG检索增强…

【SpringBoot】配置文件

配置文件官网 1. 配置方式 application.propertiesapplication.yml / application.yaml 2. 自定义配置信息 将实体类中的本应该写死的信息写在属性配置文件中。 可以使用 Value("${键名}") 获取&#xff0c;也可以使用 ConfigurationProperties(prefix"前…

访谈型软文写作方式,媒介盒子告诉你

访谈型软文一般用于维护企业形象&#xff0c;分享品牌故事。但是许多企业在写访谈型软文时经常容易跑偏或者写来写去没有逻辑&#xff0c;今天媒介盒子就来和大家分享访谈型软文的写作方式&#xff0c;看完这四点&#xff0c;小白也能写好访谈型软文&#xff01; 一、 访谈对象…

C++_构造函数与析构函数

目录 1、构造函数的写法 1.2 构造函数优化写法 2、默认构造函数与默认成员函数 2.1 默认成员函数对不同类型的处理 3、对内置类型的补丁 4、析构函数 4.1 析构函数的写法 5、默认析构函数 6、初始化列表 6.1 初始化列表的写法 6.2 初始化列表的作用 6.3 回顾与总结 …

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;按键、无源蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管默认显示第一种门铃音调&#xff0c;可通过K1键切…

flutter的SingleChildScrollView控件详解

文章目录 SingleChildScrollView的介绍和使用场景详细介绍 SingleChildScrollView的介绍和使用场景 SingleChildScrollView 是 Flutter 中的一个小部件&#xff0c;用于创建一个可滚动的单个子部件。它通常用于处理内容超出屏幕可见区域的情况&#xff0c;允许用户通过滚动来查…

5.3 Linux DNS 服务

1、概念介绍 DNS&#xff08;Domain Name System&#xff09;域名系统&#xff0c;是互联网的一项核心服务&#xff0c;可以作为域名和IP地址相互映射的一个分布式数据库&#xff0c;提供域名与IP地址的解析服务&#xff0c;能够使人们更加方便的使用域名访问互联网而不是记住…

Vue3-11- 【v-for】循环数组

v-for的基本介绍 v-for 是一个指令&#xff0c; 它是用来在 html 模板中实现循环的。它可以循环 普通的数组、也可以直接循环一个范围值&#xff0c;也可以循环对象的每个属性。v-for 的语法介绍 <div v-for"(item,index) in arrayName" : key"index"…

有哪些好用的运维管理软件?哪个工单管理系统的操作简单一些?

运维管理软件可以帮助企业更有效地管理公司内外的事务&#xff0c;比如现在不少公司就引入了工单管理系统来处理后勤和售后的事务。那么&#xff0c;有哪些好用的运维管理软件&#xff1f;哪个的操作简单一些呢&#xff1f;   随着技术的发展和成熟&#xff0c;现在的工单管理…

vue_域名部署无法访问后端

前言 目前部署的比较另类&#xff0c;因为服务器为windows&#xff0c;目前还不是很会nginx&#xff0c;所以现在就只能在服务器上安装nodejs&#xff0c;然后直接使用npm run dev命令行的方式运行项目 遇到的坑 使用ip访问前端的时候&#xff0c;就可以访问&#xff0c;但是…

压缩照片怎么压缩?半分钟解决!

有时候我们在平台上传照片的时候&#xff0c;会有图片大小限制&#xff0c;想要将照片压缩到限制的大小范围内&#xff0c;可以使用专业的图片压缩软件、图片处理软件或者在线网站压缩&#xff0c;下面给大家分享三个方法&#xff0c;压缩照片的同时还能保持图片清晰度哦&#…

Windows10安装Node.js环境

Windows10安装Node.js环境 文章目录 1.下载安装包2.安装配置2.1安装2.2 配置全局的安装路径和缓存路径2.3配置环境变量2.4配置镜像源2.5包管理工具 3.查看版本4.编译跑项目5.总结 1.下载安装包 官方下载网址如下&#xff1a; https://nodejs.org/enInstaller表示是安装程序&a…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针&#xff08;非函数指针&#xff09;&#xff1a; 有类型的函数指针&#xff1a; void 类型的指针&#xff1a; 结语 前言 进行单元测试之后&#xff0c;但凡…

LED透镜粘接UV胶是一种特殊的UV固化胶

LED透镜粘接UV胶是一种特殊的UV固化胶&#xff0c;用于固定和粘合LED透镜。 它具有以下特点&#xff1a; 1. 高透明度&#xff1a;LED透镜粘接UV胶具有高透明度&#xff0c;可以确保光线的透过性&#xff0c;不影响LED的亮度和效果。 2. 快速固化&#xff1a;经过UV紫外线照射…

HTTP 404错误:页面未找到,如何解决

在互联网上浏览时&#xff0c;偶尔会遇到“HTTP 404错误&#xff1a;页面未找到”的提示。这通常意味着用户尝试访问的网页不存在或无法找到。本文将探讨HTTP 404错误的原因以及如何解决这个问题。 一、HTTP 404错误的原因 HTTP 404错误可能是由多种原因引起的。以下是一些常…

SQL进阶理论篇(五):什么是Hash索引

文章目录 简介MySQL中的Hash索引与B树的区别总结参考文献 简介 hash&#xff0c;即哈希&#xff0c;也被称为是散列函数。 Hash在数据库中的应用&#xff0c;可以帮助我们大幅度提升检索数据的效率。 大名鼎鼎的MD5其实就是Hash函数的一种变体。 Hash算法&#xff0c;是通过…

富文本 unpkg.com地址无法访问可替代方案

一、背景&#xff1a; 项目中使用的 wangEditor富文本&#xff0c;使用的地址为&#xff1a;https://unpkg.com &#xff0c;但无法访问&#xff0c;富文本加载不出来&#xff0c;一直转圈圈 二、解决方案&#xff1a; 2.1、方案一 &#xff1a; 将项目中 https://unpkg.co…

k8s容器部署mysql5.7全流程分享

文章目录 一、前言二、打开dockerhub 看到mysql的版本为 5.7三、K8S 容器编排3.1、编写POD的相关信息3.2、编写mysql的data存储位置3.3、编写mysql的my.cnf的挂载文件3.4、编写mysql的service端口 四、启动并禁用root账户4.1 登录&#xff0c;默认密码1234564.2 配置账户权限 五…