Qt基础类03-直线类QLine

Qt基础类03-直线类QLine

  • 摘要
  • 基本信息
  • 成员函数
    • 程序全貌
    • QLine::QLine()
    • [QLine::QLine(const QPoint &p1, const QPoint &p2)](#QLine::QLine(const QPoint &p1, const QPoint &p2))
    • [QLine::QLine(int x1, int y1, int x2, int y2)](#QLine::QLine(int x1, int y1, int x2, int y2))
    • [QPoint QLine::p1() const](#QPoint QLine::p1() const)
    • [QPoint QLine::p2() const](#QPoint QLine::p2() const)
    • [int QLine::x1() const](#int QLine::x1() const)
    • [int QLine::x2() const](#int QLine::x2() const)
    • [int QLine::y1() const](#int QLine::y1() const)
    • [int QLine::y2() const](#int QLine::y2() const)
    • [QPoint QLine::center() const](#QPoint QLine::center() const)
    • [int QLine::dx() const](#int QLine::dx() const)
    • [int QLine::dy() const](#int QLine::dy() const)
    • [bool QLine::isNull() const](#bool QLine::isNull() const)
    • [void QLine::setP1(const QPoint &&p1)](#void QLine::setP1(const QPoint &&p1))
    • [void QLine::setP2(const QPoint &&p2)](#void QLine::setP2(const QPoint &&p2))
    • [void QLine::setLine(int x1, int y1, int x2, int y2)](#void QLine::setLine(int x1, int y1, int x2, int y2))
    • [void QLine::setPoints(const QPoint &p1, const QPoint &p2)](#void QLine::setPoints(const QPoint &p1, const QPoint &p2))
    • [void QLine::translate(const QPoint &offset)](#void QLine::translate(const QPoint &offset))
    • [void QLine::translate(int dx, int dy)](#void QLine::translate(int dx, int dy))
    • [QLine QLine::translated(const QPoint &&offset) const](#QLine QLine::translated(const QPoint &&offset) const)
    • [QLine QLine::translated(int dx, int dy) const](#QLine QLine::translated(int dx, int dy) const)
    • [bool QLine::operator!=(const QLine &&line) const](#bool QLine::operator!=(const QLine &&line) 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)

cpp 复制代码
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

cpp 复制代码
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

cpp 复制代码
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)

cpp 复制代码
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)

cpp 复制代码
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)

cpp 复制代码
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

cpp 复制代码
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博客

相关推荐
冷眼看人间恩怨4 分钟前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
云空5 小时前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
小老鼠不吃猫6 小时前
力学笃行(二)Qt 示例程序运行
开发语言·qt
晓纪同学8 小时前
QT创建一个模板槽和信号刷新UI
开发语言·qt·ui
爱码小白9 小时前
PyQt5 学习方法之悟道
开发语言·qt·学习方法
人才程序员1 天前
QML z轴(z-order)前后层级
c语言·前端·c++·qt·软件工程·用户界面·界面
学习BigData1 天前
【使用PyQt5和YOLOv11开发电脑屏幕区域的实时分类GUI】——选择检测区域
qt·yolo·分类
yerennuo1 天前
FFmpeg库之ffmpeg
qt·ffmpeg
冷眼看人间恩怨1 天前
【Qt笔记】QComboBox控件详解
c++·笔记·qt
阿松のblog1 天前
pyQt5实现页面切换操作
开发语言·qt