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

相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner14 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner15 天前
DicomViewer (目录调整) 2
qt
xcyxiner15 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能17 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G17 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt