QPainter,QPen,QBrush详解
QPainter:画家
QPen:画笔,控制图形的边框轮廓
QBrush:画刷,控制图形的填充颜色样式
下面是用用QGraphicsItem来重写paint事件举例
#include <QGraphicsItem>
#include <QPainter>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QApplication>
#include <QWheelEvent>
class MyRectangleItem : public QGraphicsItem
{
public:
MyRectangleItem() {
// 设置矩形的位置和大小
m_rect = QRectF(0, 0, 200, 100); // 矩形的初始位置和大小
}
// 必须重写 paint() 方法来绘制图形
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override {
// 设置画笔颜色和填充颜色
painter->setPen(Qt::red); // 边框颜色为黑色
painter->setBrush(QBrush(Qt::red, Qt::BrushStyle::Dense7Pattern)); // 填充颜色为黄色
painter->drawRect(m_rect); // 绘制矩形
}
// 返回图形项的边界矩形
QRectF boundingRect() const override {
return m_rect; // 返回矩形的边界矩形
}
private:
QRectF m_rect; // 存储矩形的位置和大小
};
class MyGraphicsView : public QGraphicsView
{
public:
MyGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene)
{
}
protected:
// 重写滚轮事件,实现缩放
void wheelEvent(QWheelEvent* event) override
{
// 使用滚轮进行缩放
if (event->angleDelta().y() > 0)
scale(1.2, 1.2); // 放大
else
scale(0.8, 0.8); // 缩小
}
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
// 创建场景
QGraphicsScene scene;
// 创建自定义的矩形项
MyRectangleItem* rectItem = new MyRectangleItem();
// 将矩形项添加到场景中
scene.addItem(rectItem);
// 创建视图并设置场景
MyGraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿
view.setRenderHint(QPainter::SmoothPixmapTransform); // 平滑图像变换
view.resize(400, 300);
view.show();
return app.exec();
}
给QPainter设置QPen和QBrush对象即可进行绘制
Qt::BrushStyle::Dense7Pattern控制画刷样式为一系列小圆点,有各种样式都可以设置
对于普通widget,可以重写paintEvent事件来进行绘制
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget* parent = nullptr) : QWidget(parent) {
// 设置窗口的大小
setFixedSize(400, 300);
}
protected:
void paintEvent(QPaintEvent* event) override {
// 创建 QPainter 对象
QPainter painter(this);
// 设置绘制颜色(例如:红色)
painter.setBrush(Qt::red); // 设置填充颜色
painter.setPen(Qt::black); // 设置边框颜色
// 绘制矩形 (x, y, width, height)
painter.drawRect(50, 50, 200, 100); // 绘制矩形
}
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MyWidget w;
w.show();
return app.exec();
}
QPainter的构造函数传入的对象为QPaintDevice,意为在哪个设备上绘制,当前widget即为绘制对象。