图形绘制

Qt的绘图功能主要依赖于QPainter,该类提供了一系列用于绘制图形的方法,作为一个跨平台框架,QPainter的底层实现会根据操作系统不同而有所差异。这篇笔记我们介绍Qt的绘图机制。

QWidget图形绘制

QWidget中,虚函数paintEvent(QPaintEvent *)用于图形绘制。我们可以自己重写这个成员函数,绘制我们自己想要的图形。绘制图形时,主要使用QPainter和QPen这两个工具类,前者相当于具体绘画时的画手,后者定义画笔。

下面例子中,我们自定义了一个DrawWidget,它初始化时使用白色填充整个区域,然后在paintEvent函数中绘制了一个矩形(Rect)。

drawwidget.h

#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>

#define cout qDebug()

class DrawWidget : public QWidget
{
    Q_OBJECT
public:
    explicit DrawWidget(QWidget *parent = nullptr);

signals:

protected:
    void paintEvent(QPaintEvent *event) override;
};

#endif // DRAWWIDGET_H

drawwidget.cpp

#include "drawwidget.h"

DrawWidget::DrawWidget(QWidget *parent) : QWidget(parent)
{
    setPalette(QPalette(Qt::white));
    setAutoFillBackground(true);
}

void DrawWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPen pen(Qt::black, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    painter.setPen(pen);
    painter.drawRect(50, 50, 100, 100);
}

这里要注意一下paintEvent()的调用时机,和游戏引擎中基于帧的绘制不同,GUI框架总体是消息驱动的。paintEvent()在组件重绘时触发该函数,我们可以手动调用QWidgetupdate()函数,它会在消息循环的下一个UI事件时触发重绘。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap