QT-------绘图

cpp 复制代码
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QLinearGradient>
#include <QVBoxLayout>
#include <QPushButton>
#include <QApplication>

class MyWidget : public QWidget {
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
        QPushButton *drawButton = new QPushButton("Draw", this);
        connect(drawButton, &QPushButton::clicked, this, &MyWidget::draw);
    }

protected:
    void paintEvent(QPaintEvent *) override {
        QPainter painter(this);

        // 设置画笔
        QPen pen(Qt::red, 2, Qt::DashLine);
        painter.setPen(pen);

        // 设置画刷
        QBrush brush(Qt::green, Qt::SolidPattern);
        painter.setBrush(brush);

        // 绘制矩形
        painter.drawRect(50, 50, 100, 100);

        // 渐变填充
        QLinearGradient gradient(50, 160, 150, 160);
        gradient.setColorAt(0, Qt::blue);
        gradient.setColorAt(1, Qt::yellow);
        painter.setBrush(gradient);
        painter.drawRect(50, 160, 100, 50);
    }

private slots:
    void draw() {
        update();
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    MyWidget w;
    w.show();
    return a.exec();
}

#include "main.moc"

QPen的主要功能

  • 线条颜色 :通过setColor方法可以设置线条的颜色,例如pen.setColor(Qt::red),让后续绘制的线条呈现红色。
  • 线条宽度 :使用setWidth来调整线条粗细,pen.setWidth(3)会绘制出宽度为3像素的线条。
  • 线条样式 :像Qt::SolidLine(实线)、Qt::DashLine(虚线 )等样式,利用setStyle方法设定,以此来改变线条的外观风格。

QBrush的主要功能

  • 填充颜色 :利用setColor指定填充颜色,brush.setColor(Qt::blue)可将填充区域设为蓝色。
  • 填充样式 :提供多种填充图案,如Qt::SolidPattern(纯色填充)、Qt::DiagCrossPattern(斜交叉线填充) ,通过setStyle来选用。

渐变填充

QT支持线性渐变、径向渐变等。以上面代码中的线性渐变为例,先创建QLinearGradient对象,设置渐变起止点,再用setColorAt设置关键位置的颜色,最后将这个渐变对象设置为画刷,绘制图形时就会呈现渐变效果。

坐标系和坐标变换

  • QT默认坐标系左上角为原点,x轴向右,y轴向下。可以通过translaterotatescale等方法对坐标系进行变换。例如painter.translate(50, 50)会把原点移动到(50, 50)这个位置,后续绘制的图形坐标都基于新原点。

视口与窗口

  • 视口:物理设备上的一块矩形区域,对应屏幕的实际像素范围。
  • 窗口:逻辑坐标系下的矩形,绘制操作基于窗口坐标系,QT会自动将窗口坐标系映射到视口,方便实现缩放、平移等效果。

绘图叠加的效果

多次调用绘图函数,后绘制的图形会叠加在前绘制的图形之上,利用这点可以组合出复杂的图案。

图形/视图架构的坐标系

  • 图形项坐标系:每个图形项有自己独立的本地坐标系,方便自身的定位与变形。
  • 场景坐标系:是图形项所在的公共空间,用于管理和组织多个图形项。
  • 视图坐标系:和设备相关,用于将场景内容展示在屏幕等输出设备上。

图形/视图架构相关的类

  • QGraphicsScene:作为图形项的容器,管理图形项的添加、删除、遍历等操作。
  • QGraphicsView:用于可视化展示场景内容,可设置滚动、缩放等视图属性。
  • QGraphicsItem :图形项基类,衍生出如QGraphicsRectItemQGraphicsEllipseItem 等具体图形类。

图形/视图架构示例程序

cpp 复制代码
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    QGraphicsScene scene;
    QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 100);
    scene.addItem(rect);

    QGraphicsView view(&scene);
    view.show();

    return a.exec();
}

QImage类

用于图像表示和处理,支持多种图像格式加载与保存,能直接访问和修改像素数据。例如:

cpp 复制代码
QImage image("input.jpg");
if (!image.isNull()) {
    // 访问像素
    QRgb pixel = image.pixel(10, 10);
    // 修改像素
    image.setPixel(10, 10, qRgb(255, 0, 0));
    image.save("output.jpg");
}

图像处理示例程序

cpp 复制代码
#include <QImage>
#include <QColor>
#include <QPixmap>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QApplication>

class ImageProcessor : public QWidget {
    Q_OBJECT

public:
    ImageProcessor(QWidget *parent = nullptr) : QWidget(parent) {
        QImage image("input.jpg");
        if (!image.isNull()) {
            for (int y = 0; y < image.height(); ++y) {
                for (int x = 0; x < image.width(); ++x) {
                    QColor color = image.pixelColor(x, y);
                    int gray = (color.red() + color.green() + color.blue()) / 3;
                    image.setPixelColor(x, y, QColor(gray, gray, gray));
                }
            }

            QPixmap pixmap = QPixmap::fromImage(image);
            QLabel *label = new QLabel(this);
            label->setPixmap(pixmap);

            QVBoxLayout *layout = new QVBoxLayout(this);
            layout->addWidget(label);
        }
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    ImageProcessor w;
    w.show();
    return a.exec();
}

#include "main.moc"

打印功能的实现

cpp 复制代码
#include <QPrinter>
#include <QPainter>
#include <QWidget>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QPrinter printer;
    printer.setOutputFileName("print.pdf");
    printer.setOutputFormat(QPrinter::PdfFormat);

    QPainter painter;
    if (painter.begin(&printer)) {
        // 在这里绘制要打印的内容,和在屏幕上绘图类似
        painter.drawText(100, 100, "This is a printed text");
        painter.end();
    }

    return a.exec();
}
相关推荐
科普瑞传感仪器20 小时前
从轴孔装配到屏幕贴合:六维力感知的机器人柔性对位应用详解
前端·javascript·数据库·人工智能·机器人·自动化·无人机
笃行客从不躺平20 小时前
线程池监控是什么
java·开发语言
星轨初途20 小时前
C++的输入输出(上)(算法竞赛类)
开发语言·c++·经验分享·笔记·算法
m***923820 小时前
Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)
数据库·redis·缓存
极地星光20 小时前
Qt/C++ 单例模式深度解析:饿汉式与懒汉式实战指南
c++·qt·单例模式
dangdang___go20 小时前
动态内存管理||malloc和free.realloc和calloc
c语言·开发语言·算法·动态内存管理
e***09620 小时前
MySQL-递归查询
数据库·windows·mysql
('-')20 小时前
《从根上理解MySQL是怎样运行的》第十三章笔记
数据库·笔记·mysql
YA33320 小时前
mcp-grafana mcp 使用stdio报错
java·开发语言
r***186420 小时前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互