QT 绘制系统

Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainterQPainterDeviceQPaintEngine三个类。

QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainterQPaintDevice之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。我们可以把QPainter理解成画笔;把QPaintDevice理解成使用画笔的地方,比如纸张、屏幕等;而对于纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了QPaintEngine类,这个类让不同的纸张、屏幕都能使用一种画笔。

下图给出了这三个类之间的层次结构(出自 Qt API 文档):

Qt 绘图系统

上面的示意图告诉我们,Qt 的绘图系统实际上是,使用QPainterQPainterDevice上进行绘制,它们之间使用QPaintEngine进行通讯(也就是翻译QPainter的指令)。

下面我们通过一个实例来介绍QPainter的使用:   

//.h文件 

class PaintedWidget : public QWidget
{
Q_OBJECT
public:
PaintedWidget(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
};

//.cpp 文件 

PaintedWidget::PaintedWidget(QWidget *parent) :
QWidget(parent)
{
resize(800, 600);
setWindowTitle(tr("Paint Demo"));
}


void PaintedWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(80, 100, 650, 500);
painter.setPen(Qt::red);
painter.drawRect(10, 10, 100, 400);
painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::blue);
painter.drawEllipse(50, 150, 400, 200);
}

//main 函数代码 

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

PaintedWidget  painter;
painter.show();

        return app.exec();

}

我们会在后面的章节详细介绍画笔QPen和画刷QBrush的属性。

另外要说明一点,请注意我们的绘制顺序,首先是直线,然后是矩形,最后是椭圆。按照这样的绘制顺序,可以看到直线是第一个绘制,位于最下一层;矩形是第二个绘制,在中间一层;椭圆是最后绘制,在最上层。

如果了解 OpenGL,肯定听说过这么一句话:OpenGL 是一个状态机。所谓状态机,就是说,OpenGL 保存的只是各种状态。比如,将画笔颜色设置成红色,那么,除非你重新设置另外的颜色,它的颜色会一直是红色。QPainter也是这样,它的状态不会自己恢复,除非你使用了各种设置函数。因此,如果在上面的代码中,我们在椭圆绘制之后再画一个矩形,它的样式还会是绿色 5 像素的轮廓线以及蓝色的填充,除非你显式地调用了设置函数进行状态的更新。这是大多数绘图系统的实现方式,包括 OpenGL、QPainter以及 Java2D。正因为QPainter是一个状态机,才会引出我们前面曾经介绍过的一个细节问题:由于paintEvent()是需要重复进入的,因此,需要注意第二次进入时,QPainter的状态是不是和第一次一致,否则的话可能会造成闪烁的现象。这个闪烁并不是由于双缓冲的问题,而是由于绘制状态的快速切换。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT是一个跨平台的应用程序开发框架,它允许开发者创建丰富的用户界面和复杂的图形处理应用。要在QT绘制五分之一圆弧,你可以利用`QPainter`类及其提供的绘图功能。 以下是一个简化的步骤来帮助你在QT绘制五分之一圆弧: ### 步骤 1: 设置画布 首先,在你的QWidget或其他支持绘制的对象内部设置一个`QPainter`对象。通常,你会通过调用`paintEvent`槽函数或直接在特定位置调用`drawArc`等方法来实现这一目标。 ```cpp void YourWidget::paintEvent(QPaintEvent *) { QPainter painter(this); // 其他画笔和背景色设置... } ``` ### 步骤 2: 绘制五分之一圆弧 QT绘制圆弧的基本语法如下: ```cpp painter.drawArc(rectX, rectY, width, height, startAngle, spanAngle) ``` 其中: - `rectX`, `rectY`: 圆弧所在的矩形区域的左上角坐标; - `width`, `height`: 矩形区域的宽度和高度; - `startAngle`: 圆弧开始的角度(从0度开始计算),单位为十进制度数; - `spanAngle`: 圆弧覆盖的角度长度(同样以十进制度数表示); 为了绘制五分之一圆弧,你需要指定开始角度、结束角度以及对应的跨度角度。 由于我们需要绘制五分之一圆弧,我们可以假设起点为(90度)开始,并选择适当的角度跨度使得总角度接近于180度(即半个圆)。例如,如果我们要绘制从45度到135度的部分,可以这样做: ```cpp // 假设宽高等于半径 * 2,因此我们只需要指定半径即可 int radius = 50; // 半径 int centerX = rectX + radius; int centerY = rectY + radius; // 开始角度为45度 int startAngle = 45; // 覆盖的角度长度为90度(半个圆弧的一半) int spanAngle = 90; painter.setPen(Qt::blue); // 设置线条颜色 painter.drawArc(centerX - radius, centerY - radius, 2*radius, 2*radius, startAngle * 16, spanAngle * 16); ``` 注意,角度转换为QT中的十六进制角度表示需要乘以16,因为QT内部使用的是一种基于字节的度量系统。 ### 相关问题: 1. **如何调整圆弧的颜色和宽度**? 可以通过设置`painter.setPen()`的参数来调整颜色和宽度,如: ```cpp painter.setPen(QPen(Qt::red, 2)); // 设置红色线条,宽度为2像素 ``` 2. **能否添加阴影效果到圆弧**? 对于简单的阴影效果,可以使用渐变填充配合`painter.setBrush()`方法。然而,要添加更复杂的效果,比如模糊阴影,可能需要使用OpenGL或者第三方库。 3. **在动态大小的窗口中保持圆弧的比例不变**? 当窗口大小改变时,保持圆弧相对于其容器大小的比例不变可以通过在事件处理器中获取当前窗口尺寸并相应地调整圆心坐标和边界进行计算。例如: ```cpp int newRadius = std::min(width(), height()) / 2; // 新的半径为较小边长的一半 int newX = width() / 2; int newY = height() / 2; // 使用新中心点和新的半径值来计算圆弧 ``` 这提供了一个基本的框架和指导原则用于在QT应用程序中绘制五分之一圆弧。通过这种方式,你可以进一步自定义和优化你的圆形绘制需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值