QPainter::setPen: Painter not active
时间: 2023-11-28 11:49:10 浏览: 428
这个错误通常出现在你没有在使用QPainter之前调用begin()方法。begin()方法告诉QPainter要开始绘制的目标,并为绘制准备一些必要的资源。请确保在使用QPainter之前调用了begin()方法。同时,使用完QPainter后也要调用end()方法来释放资源。以下是一个示例代码:
```
QPainter painter(this); // this指向QWidget,也可以是QPixmap等
painter.begin(this); // 调用begin()方法
// 绘制代码
painter.end(); // 调用end()方法
```
另外,如果你使用多个QPainter对象进行绘制,需要在每次使用前都调用begin()方法,并在使用完后调用end()方法。
相关问题
if (paths[i].size() > 1) { QPainterPath path; path.moveTo(paths[i][0]->x, paths[i][0]->y); for (int k = 1; k < paths[i].size(); k++) { path.lineTo(paths[i][k]->x, paths[i][k]->y); } if (!path.isEmpty()) { QPainter painter(this); painter.setPen(QPen(Qt::red, 2)); painter.drawPath(path); } },一運行程序就白屏退出,怎麽修改代碼
这段代码可能会在以下情况下导致程序崩溃:
- paths[i] 数组越界
- paths[i][0] 或 paths[i][k] 为空指针
- QPainter 对象没有成功创建
你可以尝试对代码进行一些修改,来解决这些问题,例如:
```cpp
if (i < paths.size() && paths[i].size() > 1 && paths[i][0] != nullptr) {
QPainterPath path;
path.moveTo(paths[i][0]->x, paths[i][0]->y);
for (int k = 1; k < paths[i].size(); k++) {
if (paths[i][k] != nullptr) {
path.lineTo(paths[i][k]->x, paths[i][k]->y);
}
}
if (!path.isEmpty()) {
QPainter painter(this);
if (painter.isActive()) {
painter.setPen(QPen(Qt::red, 2));
painter.drawPath(path);
}
}
}
```
这段代码做了以下改动:
- 添加了对 i 的越界判断,避免访问不存在的路径
- 添加了对 paths[i][k] 是否为空指针的判断,避免绘制不存在的点
- 添加了对 QPainter 创建是否成功的检查,避免绘制失败导致程序崩溃
如果程序仍然崩溃,可以考虑添加一些调试信息,例如在绘制前输出一些日志信息,以便更好地定位问题。
//畫出路綫 if (i < paths.size() && paths[i].size() > 1 && paths[i][0] != nullptr) { QPainterPath path; path.moveTo(paths[i][0]->x, paths[i][0]->y); for (int k = 1; k < paths[i].size(); k++) { if (paths[i][k] != nullptr) { path.lineTo(paths[i][k]->x, paths[i][k]->y); } } if (!path.isEmpty()) { QPainter painter(this); if (painter.isActive()) { painter.setPen(QPen(Qt::red, 2)); painter.drawPath(path); } } },修改代碼:循環所有的agv,畫出path的路徑
可以尝试以下修改代码:
```
for (int i = 0; i < agvs.size(); i++) {
//畫出路綫
if (i < paths.size() && paths[i].size() > 1 && paths[i][0] != nullptr) {
QPainterPath path;
path.moveTo(paths[i][0]->x, paths[i][0]->y);
for (int k = 1; k < paths[i].size(); k++) {
if (paths[i][k] != nullptr) {
path.lineTo(paths[i][k]->x, paths[i][k]->y);
}
}
if (!path.isEmpty()) {
QPainter painter(this);
if (painter.isActive()) {
painter.setPen(QPen(Qt::red, 2));
painter.drawPath(path);
}
}
}
}
```
这样就会循环所有的 agv,画出每个 agv 对应的路径。