Qt项目【上位机十字屏开发】

news2025/1/11 21:07:09

效果图

在这里插入图片描述

说明

重写 QWidget 中的 paintEvent() 处理绘图事件,废话不多说,上代码

源码

#ifndef MYWIDGETFORM_H
#define MYWIDGETFORM_H

#include <QWidget>

namespace Ui {
class myWidgetForm;
}

enum MYTYPE{
    SIZEWIDTH,
    SIZEHEIGHT,
    TOPWIDTH,
    TOPHEIGHT,
    MIDDLEWIDTH,
    MIDDLEHEIGHT,
    BOTTOMWIDTH,
    BOTTOMHEIGHT,

    NONE = 10,
};

class myWidgetForm : public QWidget
{
    Q_OBJECT

public:
    explicit myWidgetForm(QWidget *parent = nullptr);
    ~myWidgetForm();

    void paintEvent(QPaintEvent *event);

    void setTopWidth(int topWidth);
    void setTopHeight(int topHeight);
    void setCenterWidth(int centerWidth);
    void setCenterHeight(int centerHeight);
    void setBottomWidth(int bottomWidth);
    void setBottomHeight(int bottomHeight);

    void setZoom(int times, QSize topSize, QSize centerSize, QSize bottomSize);

public slots:
    void CrossType(MYTYPE type);

private:
    Ui::myWidgetForm *ui;
    MYTYPE myType_;

    int topWidth_;
    int topHeight_;
    int centerWidth_;
    int centerHeight_;
    int bottomWidth_;
    int bottomHeight_;
};

#endif // MYWIDGETFORM_H

#include "mywidgetform.h"
#include "ui_mywidgetform.h"
#include <QPainter>
#include <QDebug>

myWidgetForm::myWidgetForm(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidgetForm)
{
    ui->setupUi(this);
}

myWidgetForm::~myWidgetForm()
{
    delete ui;
}

void myWidgetForm::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setBrush(QColor("#000000"));

    //原点
    int posX = (width() - centerWidth_) / 2;
    int posY = (height() - (topHeight_ + centerHeight_ + bottomHeight_)) / 2;

    int sizeW = centerWidth_;
    int sizeH = topHeight_ + centerHeight_ + bottomHeight_;
    //painter.drawRect(posX, posY, sizeW, sizeH);

    int leftUpX = (sizeW - topWidth_) / 2;
    //十字
    painter.drawRect(posX + leftUpX, posY, topWidth_, topHeight_ + centerHeight_ + bottomHeight_);
    painter.drawRect(posX, posY + topHeight_, sizeW, centerHeight_ );

    //四个遮挡部分
    painter.setBrush(Qt::Dense6Pattern);
    QRect rect1(posX, posY, leftUpX, topHeight_);
    QRect rect2(posX + leftUpX + topWidth_, posY, leftUpX, topHeight_);
    QRect rect3(posX, posY + topHeight_ + centerHeight_, leftUpX, bottomHeight_);
    QRect rect4(posX + leftUpX + topWidth_, posY + topHeight_ + centerHeight_, leftUpX, bottomHeight_);
    painter.drawRect(rect1);
    painter.drawRect(rect2);
    painter.drawRect(rect3);
    painter.drawRect(rect4);

    QPen pen;
    pen.setWidth(5);
    pen.setColor(QColor("#ffffff"));
    painter.setPen(pen);

    //左上
    painter.drawLine(posX + leftUpX, posY + 0, posX + leftUpX, posY + topHeight_);
    painter.drawLine(posX + 0, posY + topHeight_, posX + leftUpX, posY + topHeight_);

    //右上
    painter.drawLine(posX + centerWidth_, posY + topHeight_, posX + topWidth_ + leftUpX, posY + topHeight_);
    painter.drawLine(posX + topWidth_ + leftUpX, posY + 0, posX + topWidth_ + leftUpX, posY + topHeight_);

    //左下
    painter.drawLine(posX + 0, posY + centerHeight_ + topHeight_, posX + leftUpX, posY + centerHeight_ + topHeight_);
    painter.drawLine(posX + leftUpX, posY + sizeH, posX + leftUpX, posY + centerHeight_ + topHeight_);

    //右下
    painter.drawLine(posX + centerWidth_, posY + topHeight_ + centerHeight_, posX + topWidth_ + leftUpX, posY + topHeight_ + centerHeight_);
    painter.drawLine(posX + topWidth_ + leftUpX, posY + sizeH, posX + topWidth_ + leftUpX, posY + topHeight_ + centerHeight_);

    //宽高
    painter.drawLine(posX + 0, posY + 0, posX + sizeW, posY + 0);
    painter.drawLine(posX + 0, posY + 0, posX + 0, posY + sizeH);


    pen.setWidth(10);
    pen.setColor(QColor("#ffff00"));
    painter.setPen(pen);

    switch(myType_) {
    case SIZEWIDTH:
        painter.drawLine(posX + 0, posY + 0, posX + sizeW, posY + 0);
        break;
    case SIZEHEIGHT:
        painter.drawLine(posX + 0, posY + 0, posX + 0, posY + sizeH);
        break;
    case TOPWIDTH:
        painter.drawLine(posX + leftUpX, posY + 0, posX + leftUpX + topWidth_, posY + 0);
        break;
    case TOPHEIGHT:
        painter.drawLine(posX + leftUpX, posY + 0, posX + leftUpX, posY + topHeight_);
        break;
    case MIDDLEWIDTH:
        painter.drawLine(posX + 0, posY + topHeight_, posX + sizeW, posY + topHeight_);
        break;
    case MIDDLEHEIGHT:
        painter.drawLine(posX + 0, posY + topHeight_, posX + 0, posY + topHeight_ + centerHeight_);
        break;
    case BOTTOMWIDTH:
        painter.drawLine(posX + leftUpX, posY + topHeight_ + centerHeight_, posX + leftUpX + topWidth_, posY + topHeight_ + centerHeight_);
        break;
    case BOTTOMHEIGHT:
        painter.drawLine(posX + leftUpX, posY + topHeight_ + centerHeight_, posX + leftUpX, posY + sizeH);
        break;
    default:
        break;
    }
    painter.end();
    update();
}

void myWidgetForm::setTopWidth(int topWidth)
{
    topWidth_ = topWidth;
}

void myWidgetForm::setTopHeight(int topHeight)
{
    topHeight_ = topHeight;
}

void myWidgetForm::setCenterWidth(int centerWidth)
{
    centerWidth_ = centerWidth;
}

void myWidgetForm::setCenterHeight(int centerHeight)
{
    centerHeight_ = centerHeight;
}

void myWidgetForm::setBottomWidth(int bottomWidth)
{
    bottomWidth_ = bottomWidth;
}

void myWidgetForm::setBottomHeight(int bottomHeight)
{
    bottomHeight_ = bottomHeight;
}

void myWidgetForm::setZoom(int times, QSize topSize, QSize centerSize, QSize bottomSize)
{
    topWidth_ = topSize.width() * times;
    topHeight_ = topSize.height() * times;
    centerWidth_ = centerSize.width() * times;
    centerHeight_ = centerSize.height() * times;
    bottomWidth_ = bottomSize.width() * times;
    bottomHeight_ = bottomSize.height() * times;
}

void myWidgetForm::CrossType(MYTYPE type)
{
    myType_ = type;
}

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

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

相关文章

XMind在软件需求分析中编写测试用例的应用技巧

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 在软件需求分析中&#xff0c;编写测试用例是确保软件质量的重要环节。之前很多同学都是用Excel&#xff0c;但是XMind作为一款功能强大的思维导图工具&#xff0c;可以在需求分析阶段帮助测试人员系统地设计和组织测试用…

报错解决——苹果电脑mac装windows10,总是提示“启动转换”安装失败:拷贝Windows安装文件时出错

报错原因&#xff1a; 所安装的镜像文件大于4GB。 解决办法一&#xff1a; 使用小于4GB的镜像文件。 参考文章&#xff1a; 安装小于4GB的windows系统镜像 小于4GB的windows10镜像下载&#xff1a; 系统库官网 解决办法二&#xff1a; 参考文章&#xff1a; Mac air装…

如何利用Maven命令使得本地 .jar 文件安装到本地仓库中,以供其他项目通过 Maven 依赖引用

文件夹打包 例如此时我的文件夹example当中有两个class文件 复制文件夹路径 cmd运行命令&#xff1a;jar cvf nation.jar -C 你的文件夹路径 . 以我的举例&#xff1a; 这样就完成了打包 导入仓库 先找到jar文件的位置&#xff0c;复制路径 并且确定自己有安装好maven命…

【概率统计】三扇门游戏(蒙提霍尔问题)

三扇门游戏 两种答案2/3的重选正确率1/2的重选正确率 正确答案 也称为蒙提霍尔问题&#xff08;Monty Hall problem&#xff09;&#xff1a; 有三扇门&#xff0c;其中只有一扇是正确的门&#xff0c;打开后将能获得一辆豪车。另外两扇门是错误选项&#xff0c;门内只有山羊。…

模板——从初级到进阶

目录 前言&#xff1a; 一、非类型模板参数 二、模板的特化 2.1 函数模板特化 2.2 类模板特化 2.2.1 全特化 2.2.2 偏特化 三、模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 四、模板总结 前言&#xff1a; 我们前面已经对初阶模板有了比较深刻的了解&#xff…

鸿蒙前端开发——工具安装与项目创建

工具安装 DevEco Studio https://developer.huawei.com/consumer/cn/ 直接下一步。 创建空项目 双击进入 空项目如下&#xff1a; 点击previewer进行预览 备用地址下载

十、OpenCVSharp 中的图像的几何变换

文章目录 简介一、平移1. 平移向量的定义和计算2. 平移操作的矩阵表示二、旋转1. 旋转角度的表示和计算2. 旋转中心的选择3. 旋转矩阵的推导和应用三、缩放1. 缩放因子的确定2. 缩放操作的数学模型3. 缩放过程中的图像插值方法(如最近邻插值、双线性插值、双三次插值)四、仿射…

Qt连接Postgres数据库

数据库相关代码可以看我这篇文章&#xff0c;今天要说的是驱动问题&#xff0c;网上很多说将Postgres/bin目录下的某些.dll文件拷贝到运行目录&#xff0c;实际测试的时候发现&#xff0c;还是加载不了驱动。 后来发现postgres可以直接下载相关的驱动依赖&#xff0c;将流程分…

计算机三级嵌入式笔记(五)——嵌入式系统的开发

目录 考点1 嵌入式系统的开发过程 考点2 嵌入式系统的开发平台与工具 考点3 嵌入式系统的调试 考点4 ADS1.2 工具软件 考点5 RVDS 考点6 GNU 考点7 基于嵌入式 Web 服务器的应用设计 23考纲 考点1 嵌入式系统的开发过程 (1)嵌入式系统的开发过程可以划分为系统需求分析与…

Golang | Leetcode Golang题解之第334题递增的三元子序列

题目&#xff1a; 题解&#xff1a; func increasingTriplet(nums []int) bool {n : len(nums)if n < 3 {return false}first, second : nums[0], math.MaxInt32for i : 1; i < n; i {num : nums[i]if num > second {return true} else if num > first {second n…

Ajax-01.原生方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Ajax-原生方式</title> </head> <!-…

Apache Tomcat 信息泄露漏洞排查处理CVE-2024-21733)

一、漏洞描述 Apache Tomcat作为一个流行的开源Web服务器和Java Servlet容器并用于很多中小型项目的开发中。其中,Coyote作为Tomcat的连接器组件,是Tomcat服务器提供的供客户端访问的外部接口,客户端通过Coyote与服务器建立链接、发送请求并且接收响应。 近日发现Apache To…

K8S系列——一、Ubuntu上安装Helm

在使用K8S搭建集群服务时&#xff0c;有时候需要用到Helm&#xff08;一个用于Kubernetes应用管理的工具&#xff09;&#xff0c;下面是在Ubuntu上安装Helm的过程。 1.更新系统软件包列表 sudo apt-get update2.安装必要的依赖项 sudo apt-get install apt-transport-https…

Java | Leetcode Java题解之第337题打家劫舍III

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(TreeNode root) {int[] rootStatus dfs(root);return Math.max(rootStatus[0], rootStatus[1]);}public int[] dfs(TreeNode node) {if (node null) {return new int[]{0, 0};}int[] l dfs(node.left);i…

【es学习】

es学习 1. 倒排索引2. stored fields 用于存储文档信息3. doc values 用于排序和聚合4. segment 具备完整搜索功能的最小单元5. lucene单机文本搜索库6. 从lucene到es&#xff1a;高性能 高扩展性 高可用7. node角色分化8. es写入流程9. es搜索流程10. 倒排索引涉及的数据结构1…

【海奇HC-RTOS平台E100-问题点】

海奇HC-RTOS平台E100-问题点 ■ 屏幕是1280*720, UI是1024*600,是否修改UI■ hc15xx-db-e100-v10-hcdemo.dtb 找不到■ 触摸屏驱动 能否给个实例■ 按键驱动■ __initcall(projector_auto_start)■ source insigt4.0 #ifdef 代码怎么自动灰显示问题■ 补丁是打在运行程序&#…

人工智能在前列腺癌中的研究进展|顶刊速递·24-08-15

小罗碎碎念 今天的推文虽然只有五篇文献&#xff0c;但是内容分布还是很均匀的&#xff0c;影像组学、病理组学和基因组学均有涉及。 第一篇和第四篇是与病理AI相关的&#xff0c;这两篇文献都很有参考价值。第一篇把我们熟知的模型&#xff08;如全监督、弱监督和无监督模型…

场外期权如何开仓和平仓?

场外期权交易是在国内已经有九年的时间了&#xff0c;第一个上市的期权品种就是上证50ETF期权&#xff0c;在国内是一直处于平稳发展阶段。场外期权如何开仓和平仓其实很简单&#xff0c;场外期权开仓都是买入开仓&#xff0c;平仓选择卖出平仓或者一键平仓&#xff0c;下文为大…

UE5学习笔记8-创建一个武器的类和蓝图

一、目标 当人物模型和武器模型重叠时显示小窗口&#xff0c;按E键时拾取武器&#xff0c;当拾取到武器时窗口不可见&#xff0c;当人物靠近其他人物时(其他客户端/服务器)窗口同样不可见&#xff0c;在具有Authority权限的PC上同理 二、实现过程 1.创建一个武器的类命名为Wea…

Android进阶之路 - res、raw、assets 资源解析、区别对比

那天遇到一个资源目录层级的问题&#xff0c;索性重新整理记录一下&#xff0c;希望能帮到如吾往昔之少年的你们&#xff0c;哈哈哈哈哈哈… 一脸茫然&#xff0c;越写越多&#xff0c;时间成本属实有点大&#xff0c;就当一起来基础扫盲吧 resdrawablemipmapvaluescolor asset…