绘图示例---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.hqwc.cn/news/268354.html

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

相关文章

windows下docker环境安装

开启硬件虚拟化技术 win10中开启 Hyper-V Win10 下是否开启硬件虚拟化技术&#xff0c;在控制面板&#xff0c;启用 window 功能&#xff0c;找到 Hyper-V 选项&#xff0c;点勾选确认。如图&#xff1a; Windows 11 家庭中文版新增 Hyper-V选项 注意以下的解决方案来自win1…

[MySQL]SQL优化之sql语句优化

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引优化 回顾&#xff1a; &#x1f4d5;索引分类&#xff1a; &#x1f4d5;索引失效&#xff1a; &#x1f4d5;设计原则&#xff1a; &#x1f4d5;SQL性能分析 二、SQL优化 语句优化 &#x1f4d…

激活企业知识力量,我有才知识付费平台:开启专属知识付费新纪元

在当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;我有才提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1a; 一…

SpringBoot入门及整合

前言 Spring Boot是一个基于Spring框架的快速开发脚手架&#xff0c;它简化了Spring应用的初始化和搭建过程&#xff0c;提供了众多便利的功能和特性并且使用"习惯优于配置"的理念&#xff0c;通过提供默认设置来快速搭建应用&#xff0c;同时也保留了灵活性以进行定…

每日一练【长度最小的子数组】

一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 二、题目解析 经…

「Swift」Xcode多Target创建

前言&#xff1a;我们日常开发中会使用多个环境&#xff0c;如Dev、UAT&#xff0c;每个环境对应的业务功能都不同&#xff0c;但每个环境之间都只存在较小的差异&#xff0c;所以此时可以使用创建多个Target来实现&#xff0c;每个Target对应这个一个App&#xff0c;可以实现一…

人工智能数据集可视化统计分析工具:快速了解你的数据集

人工智能数据集可视化统计分析工具&#xff1a;快速了解你的数据集 简介特征示例报告安装用法 简介 Lightly Insights&#xff1a;可以轻松获取关于机器学习数据集基本洞察的工具&#xff0c;可以可视化图像数据集的基本统计信息&#xff0c;仅需提供一个包含图像和对象检测标…

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

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

轻材料绿建筑:气膜结构建筑的低碳环保

随着全球环保意识的逐渐增强&#xff0c;建筑行业也在积极寻求更加环保、低碳的设计和施工方案。在这一潮流中&#xff0c;气膜结构建筑以其轻盈、独特的设计成为了低碳环保建筑的代表之一。本文将深入探讨气膜结构建筑的轻材料特性以及其在低碳环保方面的良好表现。 轻材料轻建…

luceda ipkiss教程 47:导入gds文件来搭建器件

ipkiss中的器件至少得包含版图和端口&#xff0c;通过GDSCell函数导入版图文件再加上端口&#xff0c;就可以搭建一个简单的器件&#xff1a; 如&#xff0c;已有版图文件 mmi.gds&#xff1a; 通过代码&#xff1a; from si_fab import all as pdk from ipkiss3 import all …

在我们日常生活有哪些东西是激光切割机做的

激光加工技术是当前最先进的切割技术&#xff0c;在工业生产中&#xff0c;能解决许多常规方法无法解决的难题&#xff0c;而且应用非常广。让人意想不到的是&#xff0c;很多生活中常见的物品&#xff0c;都是靠激光切割完成的。 它具备精密制造、柔性切割、异形加工、一次成型…

数据结构之选择排序

目录 直接选择排序 选择排序的时间复杂度 堆排序 向上调整算法 向下调整算法 向上调整算法建立堆 向下调整算法建立堆 堆排序整体代码 堆排序的时间复杂度 直接选择排序 在之前讲插入排序时&#xff0c;我们讲了这样的一个应用场景&#xff0c;我们在斗地主摸牌时&…