Qt基础类03-直线类QLine

news2025/3/17 14:12:55

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博客

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

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

相关文章

ComfyUI+Krea免费利用AI制作网站萌宠IP,五步搞定制作AI萌宠

大家好,这是我们网站的萌宠——Meo喵,是一只猫咪AI工具专家🐾,嘻嘻🎉🐱。是AIGC年轻的艺术家星之,利用AI产品ComfyUI、Krea,搭配PS制作而成,下面先介绍一下它的形象&…

LLM大模型教程:langchain 教程

软件安装 pip install pymupdf pip install langchain pip install langchain-cli conda install -c pytorch -c nvidia faiss-gpu1.7.4 mkl2021 blas1.0mkl由于langchain不支持qwen模型,我们需要自定义模型 from typing import Anyfrom langchain_core.language_…

‌Python开发者必学:如何优雅地绕过round函数的四舍五入陷阱

引言 在最近交付测试的一个功能中,测试同学反馈一个数据统计四舍五入的问题,问题有点魔性:同样的条件,有的值可以四舍五入成功,有的值直接被舍弃。 例如2.5四舍五入整数直接变成了2;3.5却变成了4。因为使用…

IDEA 模板配置

IDEA 模板配置 一、tkMapper通用mapper配置 1 新建配置文件generatorConfig.xml&#xff0c;路径src/main/resources/generator/generatorConfig.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-…

基于单片机的多功能电子钟设计

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP…

C学习(数据结构)-->排序

目录 一、直接插入排序 二、希尔排序 三、直接选择排序 四、快速排序 1、取基准值 1&#xff09;hoare找基准值​编辑 2&#xff09; 挖坑法找基准值​编辑 3&#xff09;快慢指针找基准值​编辑 2、递归快速排序 3、非递归快速排序 ​编辑 五、归并排序 ​编辑 六、计…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月7日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年9月7日 星期六 农历八月初五 白露 1、 司法部&#xff1a;遏制地方乱发文、出台“奇葩”政策文件等情况。 2、 证监会&#xff1a;拉长离职人员入股禁止期至10年&#xff0c;扩大对离职人员从严监管范围。 3、 全国医护比…

三文带你轻松上手鸿蒙的AI语音03-文本合成声音

三文带你轻松上手鸿蒙的AI语音03-文本合成声音 前言 接上文 三文带你轻松上手鸿蒙的AI语音02-声音文件转文本 HarmonyOS NEXT 提供的AI 文本合并语音功能&#xff0c;可以将一段不超过10000字符的文本合成为语音并进行播报。 场景举例 手机在无网状态下&#xff0c;系统应用…

超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)

超声波测距模块参考资料 1.电路连接及引脚配置 触发信号PA3只需要输出10us的高电平&#xff0c;所以直接设置成 普通的GPIO端口即可&#xff1b;回响信号使用外部中断&#xff0c;上升沿信号产生外部中断&#xff0c;打开定时器&#xff0c;下降沿再产生一次中断&#xff0c;读…

飞特STS3315基本使用方法

宁天道/FeelECH 01-介绍 串口总线舵机&#xff0c;可以通过一根线将多个舵机串联在一起&#xff0c;一个串口线片可以控制所有的舵机。 内带闭环&#xff0c;可以自定义舵机移动的最大速度&#xff0c;加速度&#xff0c; 可以修改各种模式&#xff0c;满足各种各样的需求&…

OTN光传送网-介绍

1. 引用 OTN光传送网--华为设备_otn传输设备建设方案-CSDN博客 OTN光传送网&#xff08;Optical Transport Network&#xff09;&什么是OTN-CSDN博客 https://zhuanlan.zhihu.com/p/403304019 术语&#xff1a; 英文缩写描述灰光模块彩光模块CWDM&#xff1a;Coarse Wa…

欺诈文本分类检测(十三):交叉训练验证

1. 引言 交叉验证主要讨论的是数据集的划分问题。 通常情况下&#xff0c;我们会采用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集&#xff0c;这三个集合不能有交集&#xff0c;常见的比例是8:1:1&#xff08;如同前文我们所作的划分)。这三个数据集…

吉利星座03组卫星发射

北京时间2024年9月6日2时30分&#xff0c;在太原卫星发射中心使用长征六号运载火箭&#xff0c;成功将民营“中国星链”——吉利未来出行星座第三个轨道面、吉利星座03组卫星发射升空&#xff0c;10颗卫星顺利进入预定轨道&#xff0c;发射任务获得圆满成功。此次任务是长征系列…

飞思相机存储卡格式化数据如何恢复?提供全面指南

在数字摄影时代&#xff0c;‌飞思相机以其卓越的成像质量和专业的性能&#xff0c;‌赢得了众多摄影师的青睐。‌然而&#xff0c;‌即使是专业的设备也难免遭遇数据丢失的困境&#xff0c;‌尤其是当存储卡不幸被格式化时。‌面对这一突如其来的灾难&#xff0c;‌许多摄影师…

qt QGraphicsScene场景坐标和场景内GraphicsItem局部坐标的相互转换

为了更清晰地解释场景坐标与局部坐标之间的转换过程&#xff0c;我们可以通过一个简单的实例来演示如何赋值场景坐标&#xff0c;并将其转换为图形项的局部坐标。 实例步骤 假设我们有一个场景 QGraphicsScene 和一个矩形图形项 QGraphicsRectItem&#xff0c;矩形的大小为 1…

Redis进阶(六):缓存

1.缓存 速度快的设备可以作为速度慢的设备的缓存 缓存能够有意义&#xff1a;二八定律&#xff0c;20%的数据可以应对80%的请求 通常使用redis作为数据库的缓存&#xff08;mysql&#xff09; 数据库是非常重要的组件&#xff0c;mysql速度比较慢 因为mysql等数据库&#x…

【 C++ 】类和对象的学习(三)

前言&#xff1a; &#x1f618;我的主页&#xff1a;OMGmyhair-CSDN博客 目录 一、初始化列表 二、类型转换 三、static成员 四、友元 五、内部类 六、匿名对象 一、初始化列表 当我们之前在写构造函数时&#xff0c;我们通常在构造函数内对成员变量进行赋值。但其实还…

系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践

本章考点&#xff1a; 第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲&#xff0c;本课时知识点会涉及案例分析题&#xff08;25分&#xff09;。在历年考试中&#xff0c;案例题对该部分内容都有固定考查&#xff0c;综合知识选择题目中有固定分值…

北大港中文腾讯提出ViewCrafter:一张图像就可以制作影视特效和游戏画面!

北大和港中文联合腾讯人工智能实验室提出了 ViewCrafter&#xff0c;这是一种利用视频扩散模型的先验从单个或稀疏图像合成一般场景的高保真新视图的新方法。 可以简单理解为将复杂的图像转换成新角度的图像版本。首先&#xff0c;它会使用特殊的算法来读取一张或几张图像&…

SpringBoot项目-实现简单的CRUD功能和分页查询

背景 本博文主要是创建了一个新的SpringBoot项目&#xff0c;实现基本的增删改查&#xff0c;分页查询&#xff0c;带条件的分页查询功能。是方便初学者学习后端项目的一个比较清晰明了的实践代码&#xff0c;读者可根据博文&#xff0c;从自己动手创建一个新的SpringBoot项目…