#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QLinearGradient>
#include <QVBoxLayout>
#include <QPushButton>
#include <QApplication>class MyWidget : public QWidget {Q_OBJECTpublic: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轴向下。可以通过
translate
、rotate
、scale
等方法对坐标系进行变换。例如painter.translate(50, 50)
会把原点移动到(50, 50)这个位置,后续绘制的图形坐标都基于新原点。
视口与窗口
- 视口:物理设备上的一块矩形区域,对应屏幕的实际像素范围。
- 窗口:逻辑坐标系下的矩形,绘制操作基于窗口坐标系,QT会自动将窗口坐标系映射到视口,方便实现缩放、平移等效果。
绘图叠加的效果
多次调用绘图函数,后绘制的图形会叠加在前绘制的图形之上,利用这点可以组合出复杂的图案。
图形/视图架构的坐标系
- 图形项坐标系:每个图形项有自己独立的本地坐标系,方便自身的定位与变形。
- 场景坐标系:是图形项所在的公共空间,用于管理和组织多个图形项。
- 视图坐标系:和设备相关,用于将场景内容展示在屏幕等输出设备上。
图形/视图架构相关的类
- QGraphicsScene:作为图形项的容器,管理图形项的添加、删除、遍历等操作。
- QGraphicsView:用于可视化展示场景内容,可设置滚动、缩放等视图属性。
- QGraphicsItem:图形项基类,衍生出如
QGraphicsRectItem
、QGraphicsEllipseItem
等具体图形类。
图形/视图架构示例程序
#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类
用于图像表示和处理,支持多种图像格式加载与保存,能直接访问和修改像素数据。例如:
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");
}
图像处理示例程序
#include <QImage>
#include <QColor>
#include <QPixmap>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QApplication>class ImageProcessor : public QWidget {Q_OBJECTpublic: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"
打印功能的实现
#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();
}