当前位置: 首页 > news >正文

Qt基础类03-直线类QLine

Qt基础类03-直线类QLine

  • 摘要
  • 基本信息
  • 成员函数
    • 程序全貌
    • QLine::QLine()
    • QLine::QLine(const QPoint &p1, const QPoint &p2)
    • QLine::QLine(int x1, int y1, int x2, int y2)
    • QPoint QLine::p1() const
    • QPoint QLine::p2() const
    • int QLine::x1() const
    • int QLine::x2() const
    • int QLine::y1() const
    • int QLine::y2() const
    • QPoint QLine::center() const
    • int QLine::dx() const
    • int QLine::dy() const
    • bool QLine::isNull() const
    • void QLine::setP1(const QPoint &&p1)
    • void QLine::setP2(const QPoint &&p2)
    • void QLine::setLine(int x1, int y1, int x2, int y2)
    • void QLine::setPoints(const QPoint &p1, const QPoint &p2)
    • void QLine::translate(const QPoint &offset)
    • void QLine::translate(int dx, int dy)
    • QLine QLine::translated(const QPoint &&offset) const
    • QLine QLine::translated(int dx, int dy) const
    • bool QLine::operator!=(const QLine &&line) const
    • bool QLine::operator==(const QLine &line) const
  • 技巧
  • 写在后面
  • 体会
  • 系列博文

摘要

1.本文测试验证了QT5中的QLine直线类的各成员函数和属性

2.本文适用于学习QT的新手入门及练习,老手请绕路。

3.工程上传至CSDN,供同一时期学习QT的网友参考,可自行查看。

基本信息

时间:2024.09.07
QT版本:5.14.2
平台:window 10

程序简介:

  1. 本工程是Qt基础类和基本数据类型专题例程,QLine直线类

  2. 本工程对照着Qt的帮助文档,把每个属性和成员函数测试了一遍

成员函数

程序全貌

这个练习程序,是对照着QT中QLine的帮助文档,一个一个测试形成的。多数成员函数比较简单,看一眼上去知道怎么用。只在关于偏移的4个函数,需要注意一下,理解一下,但也不是很难。

本文链接地址 Qt基础类03-直线类QLine-CSDN博客,转载请注明出处。

QLine类提供了不同的构造函数,以QPoint坐标类初始化的,以int类型提供x和y坐标直接初始化的,也提供了设置、获取起点和终点的坐标的函数,特别的是可以方便的获取直线的中点,不必自己算。

可流化的2个函数没有进行测试。

全貌如下图:
在这里插入图片描述

QLine::QLine()

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

QLine::QLine(const QPoint &p1, const QPoint &p2)

void DrawWidget1::paintEvent(QPaintEvent *)
{QPainter painter(this);QPoint p1(100,200);QPoint p2(600,200);QLine qline(p1,p2);painter.setPen(Qt::red);painter.drawLine(qline);label3->setText(tr("画出的直线如下:"));
}

程序运行效果如下:
在这里插入图片描述

QLine::QLine(int x1, int y1, int x2, int y2)

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

QPoint QLine::p1() const

代码未贴,请直接下载去看例程,程序运行效果如下:

在这里插入图片描述

QPoint QLine::p2() const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

int QLine::x1() const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

int QLine::x2() const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

int QLine::y1() const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

int QLine::y2() const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

QPoint QLine::center() const

void DrawWidget9::paintEvent(QPaintEvent *)
{QPainter painter(this);QPoint p1(100,150);QPoint p2(650,350);QLine qline(p1,p2);painter.setPen(Qt::blue);painter.drawLine(qline);label3->setText(tr("qline的起点坐标是:%1,%2").arg(qline.x1()).arg(qline.y1()));label4->setText(tr("qline的终点坐标是:%1,%2").arg(qline.x2()).arg(qline.y2()));QPoint centerPoint;centerPoint=qline.center();label5->setText(tr("该直线中心点的坐标是:%1,%2").arg(centerPoint.x()).arg(centerPoint.y()));
}

程序运行效果如下:
在这里插入图片描述

int QLine::dx() const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

int QLine::dy() const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

bool QLine::isNull() const

void DrawWidget12::paintEvent(QPaintEvent *)
{QPainter painter(this);QPoint p1(150,200);QPoint p2(650,350);QLine qline1(p1,p2);painter.setPen(Qt::blue);painter.drawLine(qline1);label3->setText(tr("qline1的起点坐标是:%1,%2").arg(qline1.x1()).arg(qline1.y1()));label4->setText(tr("qline1的终点坐标是:%1,%2").arg(qline1.x2()).arg(qline1.y2()));QLine qline2(0,0,0,0);label5->setText(tr("qline2的起点坐标是:%1,%2").arg(qline2.x1()).arg(qline2.y1()));label6->setText(tr("qline2的终点坐标是:%1,%2").arg(qline2.x2()).arg(qline2.y2()));bool result1=qline1.isNull();bool result2=qline2.isNull();label7->setText(tr("qline1.isNull()=%1,qline2.isNull()=%2").arg((result1?"true":"false")).arg((result2?"true":"false")));
}

程序运行效果如下:
在这里插入图片描述

void QLine::setP1(const QPoint &&p1)

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

void QLine::setP2(const QPoint &&p2)

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

void QLine::setLine(int x1, int y1, int x2, int y2)

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

void QLine::setPoints(const QPoint &p1, const QPoint &p2)

void DrawWidget16::paintEvent(QPaintEvent *)
{QPainter painter(this);QPoint p1(650,150);QPoint p2(100,350);QLine qline;qline.setPoints(p1,p2);painter.setPen(Qt::red);painter.drawLine(qline);label3->setText(tr("qline的起点坐标是:%1,%2").arg(qline.x1()).arg(qline.y1()));label4->setText(tr("qline的终点坐标是:%1,%2").arg(qline.x2()).arg(qline.y2()));
}

程序运行效果如下:
在这里插入图片描述

void QLine::translate(const QPoint &offset)

void DrawWidget17::paintEvent(QPaintEvent *)
{QPainter painter(this);QPoint p1(350,200);QPoint p2(400,250);QLine qline(p1,p2);painter.setPen(Qt::red);painter.drawLine(qline);label3->setText(tr("偏移前,qline的起点坐标是:%1,%2,qline的终点坐标是:%3,%4").arg(qline.x1()).arg(qline.y1()).arg(qline.x2()).arg(qline.y2()));QPoint p(100,50);label4->setText(tr("偏移点坐标是:%1,%2").arg(p.x()).arg(p.y()));qline.translate(p);painter.setPen(Qt::blue);painter.drawLine(qline);label5->setText(tr("偏移后,qline的起点坐标是:%1,%2,qline的终点坐标是:%3,%4").arg(qline.x1()).arg(qline.y1()).arg(qline.x2()).arg(qline.y2()));
}

程序运行效果如下:
在这里插入图片描述

void QLine::translate(int dx, int dy)

void DrawWidget18::paintEvent(QPaintEvent *)
{QPainter painter(this);QPoint p1(350,200);QPoint p2(400,250);QLine qline(p1,p2);painter.setPen(Qt::red);painter.drawLine(qline);label3->setText(tr("偏移前,qline的起点坐标是:%1,%2,qline的终点坐标是:%3,%4").arg(qline.x1()).arg(qline.y1()).arg(qline.x2()).arg(qline.y2()));int dx=100;int dy=50;label4->setText(tr("偏移距离dx=%1,偏移距离dy=%2").arg(dx).arg(dy));qline.translate(dx,dy);painter.setPen(Qt::blue);painter.drawLine(qline);label5->setText(tr("偏移后,qline的起点坐标是:%1,%2,qline的终点坐标是:%3,%4").arg(qline.x1()).arg(qline.y1()).arg(qline.x2()).arg(qline.y2()));
}

程序运行效果如下:
在这里插入图片描述

QLine QLine::translated(const QPoint &&offset) const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

QLine QLine::translated(int dx, int dy) const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

bool QLine::operator!=(const QLine &&line) const

代码未贴,请直接下载去看例程,程序运行效果如下:
在这里插入图片描述

bool QLine::operator==(const QLine &line) const

void DrawWidget22::paintEvent(QPaintEvent *)
{QPainter painter(this);QLine qline1(100,250,600,250);QLine qline2(600,250,100,250);QLine qline3(100,250,600,250);painter.setPen(Qt::red);painter.drawLine(qline1);label3->setText(tr("qline1的起点坐标是:%1,%2,qline1的终点坐标是:%3,%4").arg(qline1.x1()).arg(qline1.y1()).arg(qline1.x2()).arg(qline1.y2()));painter.setPen(Qt::green);painter.drawLine(qline2);label4->setText(tr("qline2的起点坐标是:%1,%2,qline2的终点坐标是:%3,%4").arg(qline2.x1()).arg(qline2.y1()).arg(qline2.x2()).arg(qline2.y2()));painter.setPen(Qt::blue);painter.drawLine(qline2);label5->setText(tr("qline3的起点坐标是:%1,%2,qline3的终点坐标是:%3,%4").arg(qline3.x1()).arg(qline3.y1()).arg(qline3.x2()).arg(qline3.y2()));bool result12=qline1.operator==(qline2);bool result13=qline1.operator==(qline3);label6->setText(tr("qline1.operator==(qline2)的结果是:%1").arg((result12?"true":"false")));label7->setText(tr("qline1.operator==(qline3)的结果是:%1").arg((result13?"true":"false")));
}

程序运行效果如下:
在这里插入图片描述

技巧

  1. QLine的起点和终点重合,会被视为对象为空。

  2. 在窗体上画线,要使用QPainter类,要重写paintEvent()函数。

  3. QT中的布局,要达到左对齐、右对齐、居中对齐、顶部、底部等等布局,必须请神器弹簧控件出场搞定。预计24年的10月,应该会写关于QT布局的专题。

  4. 不创建对象直接操作对象,会使程序崩溃。比如没有去new QLabel对象,直接去label.setText();程序会崩溃,提示信息并不直观,并不友好。只是告诉我程序崩溃了,但不告诉我为什么。关于调试,再熟悉一段时间,开个专题写QT的调试。

写在后面

  • 本例程为了将QLine直线类可视化,直接在窗体中把直线画了出来。这一部分不属于QLine的范畴。

  • 本例程把每一个函数用窗体进行了展示和输出,没有把信息输出在终端里,改为了用QLabel输出在窗体中。

  • 本工程创建时还是使用了ui进行布局的,看工程中这一堆新添加的文件,没有去整理工程,这个工作也不计划再重新构建工程了,就这样,把时间用在最重要的知识点上。

  • 下一个例程,计划自己用代码写布局了,不用ui文件了。

    1.台式机27寸,1080P的显示器。笔记本14寸,2K分辨率的显示器。算是体验了把”QT对高分屏幕支持不好“

    2.写好的工程,当用笔记本准备发blog时,发现笔记本2k屏幕,150%放大的时候,这界面简直惨不忍睹啊~!于是,又花了点时间,重要改了代码,重新截的图。才有了本文。

体会

  • 自己不动手,永远是纸上谈兵。必须实践,用代码说话。光看兵法不去打仗,基本上上战场就得死。

  • 调整心态,欲速则不达,一个实践一个实践去积累,慢慢会超越很多人的。

系列博文

Qt基础类01–坐标类QPoint-CSDN博客

Qt基础类02-坐标类QPointF-CSDN博客

Qt基础类03-直线类QLine-CSDN博客

相关文章:

Qt基础类03-直线类QLine

Qt基础类03-直线类QLine 摘要基本信息成员函数程序全貌QLine::QLine()QLine::QLine(const QPoint &p1, const QPoint &p2)QLine::QLine(int x1, int y1, int x2, int y2)QPoint QLine::p1() constQPoint QLine::p2() constint QLine::x1() constint QLine::x2() consti…...

集成电路学习:什么是ARM先进精简指令集计算机

ARM:先进精简指令集计算机 ARM先进精简指令集计算机(Advanced RISC Machine,简称ARM)是一种基于精简指令集计算机(RISC)原则的计算机处理器架构,由英国的ARM公司开发。这种架构以其低功耗和高性…...

设计模式-行为型模式-迭代器模式

1.迭代器模式的定义 迭代器模式提供一种对容器对象中的各个元素进行访问的方法,而不需要暴露该对象的内部细节; 在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据;从依赖性上看,前者…...

FRP代理(QUIC通信)实验

访问关系与TCP实验相同,配置不一样 服务端配置 客户端配置 通信数据...

项目依赖拉不下来卡着不动怎么办,node又不支持cnpm

如果你的项目依赖在拉取时卡住,可以尝试以下步骤来解决问题: 检查网络:确保你的网络连接稳定。如果可能,尝试使用 VPN 或更换网络。 使用镜像源: 对于 yarn,可以使用淘宝镜像: yarn confi…...

ansible--role

简介 roles是ansible,playbooks的目录的组织结构,将代码或文件进行模块化,成为roles的文件目录组织结构。 易读,代码可冲哟美好,层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…...

SpinalHDL之数据类型(一)

本文作为SpinalHDL学习笔记第五十四篇,介绍SpinalHDL的Bool数据类型。 SpinalHDL技术交流QQ群: Note: 1.本群是个人技术交流群,不是什么官方答疑群; 2.提问是你的权利,但回答不是别人的义务; 3.可以潜水,不能灌水; 4.请文明交流,做这行的都算高层次人才,希望你…...

Ansys Zemax | 什么是Sobol取样?

附件下载 联系工作人员获取附件 本文主要介绍了: 什么是Sobol取样? 和随机光线产生方法相比,Sobol取样有什么优点? Sobol取样有什么限制? 随机取样和Sobol取样模式 一个光源会在位置空间以及角度空间随机产生光…...

Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现·案例热更】

Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 目录 Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 一、简单介绍 二、YooAsset 引…...

vue3写一个无限树形菜单,递归组件

原本使用element plus的el-tree&#xff0c;可是他的UI不匹配&#xff0c;狠难改成自己想要的&#xff0c;所以只能自己去写一个&#xff0c;做法&#xff1a;使用递归组件 效果 组件代码itemDir.vue // itemDir.vue<template><div><ul v-for"node in li…...

3D建模主要使用哪些软件?有什么特点?

3D建模主要使用的软件多种多样&#xff0c;每种软件都有其独特的优势和适用领域。以下是一些主流的3D建模软件&#xff1a; 1. Autodesk 3ds Max 概述&#xff1a;3ds Max是一款功能丰富的建模和动画软件&#xff0c;广泛用于电影、游戏和虚拟现实等领域。 特点&#xff1a;…...

Android Studio 加载多个FLutter项目

按顺序操作即可 选择工程 选择Modules, 导入 module 选中创建module 选择要导入的目录&#xff0c;只选择主目录&#xff0c;下面的文件不要选 添加完成&#xff0c;点击ok后&#xff0c;会进行导入 最终导入成功...

SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座

数字化办公时代&#xff0c;企业升级 IT 基础设施&#xff0c;已不再是选择题&#xff0c;而是必答题。 数字化办公时代&#xff0c;企业为何要升级 IT 基础设施&#xff1f; 随着时代变化与科技进步&#xff0c;人们的工作方式也发生了巨大变化。如今&#xff0c;远程办公、全…...

l超市售货管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;会员管理&#xff0c;供应商信息管理&#xff0c;商品管理&#xff0c;出入库管理&#xff0c;公告管理&#xff0c;轮播图信息 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;…...

systemverilog、verilog的部分常用内部函数

1. $ceil 作用&#xff1a;将给定的实数或浮点数向上取整。示例&#xff1a;$ceil(3.2) 返回 4。 2. $floor 作用&#xff1a;将给定的实数或浮点数向下取整。示例&#xff1a;$floor(3.9) 返回 3。 3. $value$plusargs 作用&#xff1a;从命令行读取传递给仿真器的参数。…...

Python趣味绘图案例

文章目录 系列文章趣味绘图案例1. 绘制简单的正方形2. 绘制五角星3. 绘制同心圆4. 绘制彩虹弧5. 绘制螺旋线6. 绘制六边形7. 绘制花形图案8. 绘制波浪线9. 绘制柱状图10. 绘制饼图 系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Pyt…...

P3588 [POI2015] PUS

~~~~~ P3588 [POI2015] PUS ~~~~~ 总题单链接 思路 ~~~~~ 这道题的关键点在于线段树优化建图。 ~~~~~ 对每条限制新建一个虚电 p p p&#xff0c;将输入的 x 1 ∼ k x_{1\sim k} x1∼k​ 连向 p p p&#xff0c;再将 p p p 连向区间内单的其他点&#xff0c;建完图后拓扑排…...

指针(四)

指针和数组笔试题解析 一维数组 字符数组 &#xff08;没有\0&#xff09; 字符数组&#xff08;有\0&#xff09; 重点讲一下printf("%d\n", strlen(*p))&#xff1b; 这个strlen函数中是从地址开始寻找&#xff0c;而非元素本身&#xff1b;假设计算的是元素本…...

0902,DEQUE,LIST,VECTOR

目录 01_vector.cc 02_vector.cc 作业 01STL包括哪些组件&#xff1f;各自具有哪些特点&#xff1f; 02 序列式容器包括哪些&#xff1f;他们之间有哪些异同&#xff1f; 03 下面程序有什么错误&#xff1f; 04 创建和初始化vector的方法&#xff0c;每种都给出一个实例…...

LeetCode 每日一题 2024/9/2-2024/9/8

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/2 3153. 所有数对中数位不同之和9/3 2708. 一个小组的最大实力值9/4 2860. 让所有学生保持开心的分组方法数9/5 3174. 清除数字9/6 3176. 求出最长好子序列 I9/7 3177. 求…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素&#xff0c;以下是主要的定位方式&#xff1a; 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...