QPainter::setFont: Painter not active
时间: 2024-10-16 11:13:03 浏览: 29
当在`QPainter`上调用`setFont()`函数时收到"Painter not active"错误,意味着你试图改变画刷的字体属性,但在当前状态下,画笔并没有处于活动状态,也就是说它并未实际绘制在任何地方。在`QPainter`中,通常要在开始绘制前激活它,并在绘制完成后关闭。
正确的做法应该是在调用`begin()`方法启动绘画操作后,使用`setFont()`,然后在结束绘画操作前使用`end()`:
```cpp
QFont font;
font.setFamily(QStringLiteral("Arial")); // 设置字体
QPainter painter(&view->viewport()); // 将painter绑定到某个可以绘制的对象,如视口
painter.setFont(font); // 设置字体
// 现在可以正常绘制文字
painter.drawText(...);
// 绘制结束后关闭painter
painter.end();
```
如果你在`setFont()`之前就出现了这个错误,那可能是因为你忘记调用`begin()`,或者在此之前已经调用了`end()`,使得画笔关闭了。确保在整个绘图操作期间,`painter`对象始终处于活跃状态。
相关问题
QPainter::begin: Paint device returned engine == 0, type: 1 QPainter::setFont: Painter not active
当遇到`QPainter::begin: Paint device returned engine == 0, type: 1`这样的错误时,意味着你试图开始使用`QPainter`之前,所指的绘图设备(如窗口或图像内存)并没有正确初始化。这通常发生在以下情况之一:
- 你忘记为`QPainter`提供有效的绘图对象,比如一个`QWidget`或`QImage`:
```cpp
QPainter painter; // 这里需要传递一个具体的设备对象,如 painter.begin(window)
```
- 或者,你尝试在已经关闭或结束的`QPainter`上下文中继续绘制:
```cpp
painter.end(); // 如果这里已调用过end(),就不能再用它了
```
`QPainter::setFont: Painter not active`错误提示表示当前的`QPainter`对象并未处于活动状态,也就是说你没有开始画画。你应该先调用`begin()`来激活它,然后再设置字体:
```cpp
QFont myFont("宋体", 14);
QPainter painter(widget);
painter.begin(); // 激活painter
painter.setFont(myFont);
```
一旦活跃,你就可以正常地在`painter`上进行文本或其他元素的绘制。
QPainter::translate: Painter not active QPainter::rotate: Painter not active
这个错误通常发生在没有开始绘制之前调用了QPainter的绘图函数。请确保您已经调用了begin()函数来开始绘制,例如:
```
QPainter painter(this); // this为绘制的目标设备,例如QWidget或QPixmap
painter.begin(this); // 开始绘制
// 绘制代码,例如:
painter.drawPixmap(agvs[i].current_x*25+200-(agv_size-nodeSize)/2,(agvs[i].current_y+1)*25+50-(agv_size-nodeSize)/2,agv_size,agv_size,QPixmap(":/new/prefix1/agv1.png").scaled(25,25));
painter.translate(agvs[i].current_x*25+200, (agvs[i].current_y+1)*25+50);
painter.rotate(agvs[i].angle_);
painter.drawPixmap(-agv_size/2, -agv_size/2, agv_size, agv_size, agvPixmap.scaled(25, 25).transformed(QTransform().rotate(agvs[i].angle_)));
painter.end(); // 结束绘制
```
这里我们使用QPainter的begin()函数开始绘制,然后在绘制代码中调用translate()和rotate()函数。最后,我们使用end()函数结束绘制。
阅读全文