for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad() == true) { // 如果是负载的状态 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { // 如果到达终点 agvs[i].setLoad(false); // 设置为空载状态 agvs[i].setState(true); std :: cout << "agv__id :" << agvs[i].getid() << " ,agv_get_task_id :" << agvs[i].get_task_id() << endl; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (completed_task_index != -1) { tasks[completed_task_index].completed = 2; } task_to_agv(); // 更新任务分配 update(); // 更新AGV状态 } else { // 否则行驶到终点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_end = astar.getPath(start_node, end_node1); path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path; } } else { // 如果是空载的状态 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { // 如果到达起点 agvs[i].setLoad(true); // 设置为负载状态 } else { // 否则行驶到起点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); paths[i] = path; } } },爲什麽在MainWindow::paintEvent函數中,一涉及paths數組,畫面就會卡死,怎麽修改
时间: 2024-01-30 21:01:42 浏览: 68
可能是因为在paintEvent函数中,每次都需要重新计算路径并绘制AGV的位置,导致性能问题。你可以尝试将路径的计算和AGV位置的更新放在一个单独的函数中,并在paintEvent函数中只进行绘制操作。
另外,你可以尝试使用双缓冲技术,先将需要绘制的图形绘制到一张缓冲区中,然后再将缓冲区中的图形绘制到屏幕上,这样可以减少图形闪烁和卡顿的问题。
具体实现方法可以参考以下代码:
```cpp
// 在MainWindow类中增加一个QImage变量,用于存储缓冲区图像
QImage bufferImage;
// 在一个单独的函数中计算路径并更新AGV位置
void updatePaths() {
// 计算路径和更新AGV位置的代码
// ...
// 将绘制操作放在这里,将绘制结果绘制到缓冲区中
QPainter painter(&bufferImage);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.fillRect(0, 0, width(), height(), Qt::white);
for (int i = 0; i < agvs.size(); i++) {
// 绘制AGV的代码
// ...
// 绘制路径的代码
// ...
}
}
// 在MainWindow类中重写paintEvent函数
void MainWindow::paintEvent(QPaintEvent *event) {
// 将缓冲区图像绘制到屏幕上
QPainter painter(this);
painter.drawImage(0, 0, bufferImage);
}
// 在MainWindow类中重写resizeEvent函数,重新创建缓冲区图像
void MainWindow::resizeEvent(QResizeEvent *event) {
bufferImage = QImage(size(), QImage::Format_RGB32);
bufferImage.fill(Qt::white);
}
```
这样就可以避免在paintEvent函数中计算路径和更新AGV位置,从而提高程序的性能,并使用双缓冲技术避免图形闪烁和卡顿的问题。
阅读全文