void MainWindow::moveAgvs_(){ timer =new QTimer(this); timer->start(500); connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);} void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path_to_end = astar.getPath(end_node, end_node1); // 去掉 end_node1 path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin()+1 , path_to_start.end()); path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path; //輸出agv的路綫 std::cout << "AGV " << i << " path: "; for (int j = 0; j < path.size(); j++) { std::cout << "(" << path[j]->x << ", " <<path[j]->y << ")"; if (j != path.size() - 1) { std::cout << " -> "; } } std::cout << std::endl; } for (int i = 0; i < agvs.size(); i++) { if (! paths[i].empty()) { Node* next_node = paths[i][1]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; QTimer::singleShot(time, this, &, i, next_node { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl; this->update(); if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY()) { //task_to_agv(i); } }); } } },爲什麽每次運行以後agv的current的x和y沒有得到path下一個節點的坐標,怎麽修改
时间: 2023-07-16 10:13:30 浏览: 162
在您的代码中,`QTimer::singleShot`函数的语法有一些错误。正确的语法应该是:
```
QTimer::singleShot(time, this, [=]() {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl;
this->update();
if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY()) {
//task_to_agv(i);
}
});
```
您需要使用lambda表达式来捕获`i`和`next_node`变量。在lambda函数中,您可以使用这些变量来更新当前AGV的位置。请注意,您需要将lambda表达式作为第三个参数传递给`QTimer::singleShot`函数。
另外,您需要确保`paths`向量包含的节点数量大于1,因为您要让AGV移动到下一个节点。如果`paths`向量为空,则不应该尝试移动AGV。
相关问题
#include "mainwindow.h" #include "ui_mainwindow.h" #include<QMessageBox> #include<QTextEdit> #include<QPushButton> TemperatureThread::TemperatureThread(QObject *parent) : QThread(parent) { m_temperature = 0.0; QPushButton * btn= new QPushButton(); //btn->show(); btn->setText("this"); btn->setParent(QObject); } void TemperatureThread::run() { while (true){ m_temperature = qrand() % 100; emit temperatureChanged(m_temperature); msleep(1000); } } MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); m_temperatureThread = new TemperatureThread(this); m_timer = new QTimer(this); m_threshold = 0.0; connect(m_temperatureThread, &TemperatureThread::temperatureChanged, this,&MainWindow::updateTemperature); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_startButton_clicked() { if (m_timer->isActive()) { QMessageBox::warning(this,tr("Warning"),tr("Alarm already started")); return; } bool ok; m_threshold = ui->thresholdEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this,tr("warning"),tr("Invalid")); return; } m_temperatureThread->start(); m_timer->start(1000); } void MainWindow::on_stopButton_clicked() { if (!m_timer->isActive()){ QMessageBox::warning(this,tr("Warning"),tr("Alarm not started yet")); return; } m_temperatureThread->quit(); m_temperatureThread->wait(); m_timer->stop(); ui->temperatureLabel->setText(tr("0.0")); } void MainWindow::updateTemperature(double temperature) { ui->temperatureLabel->setText(QString::number(temperature)); if (temperature > m_threshold){ QMessageBox::critical(this,tr("Warning"),tr("Temperature too high")); } }错在哪
代码存在一些问题:
1. 在 TemperatureThread 的构造函数中创建了一个 QPushButton 实例,但并没有将其添加到界面中。
2. 在创建 QPushButton 实例时,使用了 QObject 作为其父对象,应该使用 MainWindow 或其子类作为父对象。
3. 在 on_startButton_clicked 函数中,应该先判断是否已经启动了温度线程,再进行阈值的设置和启动定时器。
4. 在 on_stopButton_clicked 函数中,应该先判断是否已经启动了定时器和温度线程,再停止定时器和温度线程,并将温度显示标签的文本清零。
5. 在 updateTemperature 函数中,应该将温度值转换为字符串后再设置到温度显示标签上。
下面是修改后的代码:
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QTextEdit>
#include <QPushButton>
TemperatureThread::TemperatureThread(QObject *parent)
: QThread(parent)
{
m_temperature = 0.0;
}
void TemperatureThread::run()
{
while (true){
m_temperature = qrand() % 100;
emit temperatureChanged(m_temperature);
msleep(1000);
}
}
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_temperatureThread = new TemperatureThread(this);
m_timer = new QTimer(this);
m_threshold = 0.0;
connect(m_temperatureThread, &TemperatureThread::temperatureChanged,
this, &MainWindow::updateTemperature);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_startButton_clicked()
{
if (m_temperatureThread->isRunning()) {
QMessageBox::warning(this,tr("Warning"),tr("Alarm already started"));
return;
}
bool ok;
m_threshold = ui->thresholdEdit->text().toDouble(&ok);
if (!ok) {
QMessageBox::warning(this,tr("warning"),tr("Invalid"));
return;
}
m_temperatureThread->start();
m_timer->start(1000);
}
void MainWindow::on_stopButton_clicked()
{
if (!m_timer->isActive() || !m_temperatureThread->isRunning()) {
QMessageBox::warning(this,tr("Warning"),tr("Alarm not started yet"));
return;
}
m_temperatureThread->quit();
m_temperatureThread->wait();
m_timer->stop();
ui->temperatureLabel->setText(QString::number(0.0));
}
void MainWindow::updateTemperature(double temperature)
{
ui->temperatureLabel->setText(QString::number(temperature));
if (temperature > m_threshold){
QMessageBox::critical(this,tr("Warning"),tr("Temperature too high"));
}
}
```
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QMessageBox>#include <QTextEdit>#include <QPushButton>TemperatureThread::TemperatureThread(QObject *parent) : QThread(parent){ m_temperature = 0.0;}void TemperatureThread::run(){ while (true){ m_temperature = qrand() % 100; emit temperatureChanged(m_temperature); msleep(1000); }}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); m_temperatureThread = new TemperatureThread(this); m_timer = new QTimer(this); m_threshold = 0.0; connect(m_temperatureThread, &TemperatureThread::temperatureChanged, this, &MainWindow::updateTemperature);}MainWindow::~MainWindow(){ delete ui;}void MainWindow::on_startButton_clicked(){ if (m_temperatureThread->isRunning()) { QMessageBox::warning(this,tr("Warning"),tr("Alarm already started")); return; } bool ok; m_threshold = ui->thresholdEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this,tr("warning"),tr("Invalid")); return; } m_temperatureThread->start(); m_timer->start(1000);}void MainWindow::on_stopButton_clicked(){ if (!m_timer->isActive() || !m_temperatureThread->isRunning()) { QMessageBox::warning(this,tr("Warning"),tr("Alarm not started yet")); return; } m_temperatureThread->quit(); m_temperatureThread->wait(); m_timer->stop(); ui->temperatureLabel->setText(QString::number(0.0));}void MainWindow::updateTemperature(double temperature){ ui->temperatureLabel->setText(QString::number(temperature)); if (temperature > m_threshold){ QMessageBox::critical(this,tr("Warning"),tr("Temperature too high")); }}这段代码怎么改,可以使timer的数据逐渐增大,而不是随意乱弹出数据
您可以使用一个变量来保存当前的时间,每次更新温度时增加这个变量的值,然后用变量的值作为计时器的间隔。具体来说,您需要做以下更改:
1.在MainWindow类中添加一个私有变量m_time,用于保存当前时间。
2.在MainWindow类的构造函数中将m_time初始化为0。
3.在MainWindow类的updateTemperature函数中增加m_time的值。
4.在MainWindow类的on_startButton_clicked函数中,将计时器的间隔设置为m_time的值,并在开始计时器之前将m_time的值增加。
5.在MainWindow类的on_stopButton_clicked函数中,停止计时器时将m_time重置为0。
下面是修改后的代码:
```
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QTextEdit>
#include <QPushButton>
TemperatureThread::TemperatureThread(QObject *parent)
: QThread(parent){
m_temperature = 0.0;
}
void TemperatureThread::run(){
while (true){
m_temperature = qrand() % 100;
emit temperatureChanged(m_temperature);
msleep(1000);
}
}
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow){
ui->setupUi(this);
m_temperatureThread = new TemperatureThread(this);
m_timer = new QTimer(this);
m_threshold = 0.0;
m_time = 0;
connect(m_temperatureThread, &TemperatureThread::temperatureChanged,
this, &MainWindow::updateTemperature);
}
MainWindow::~MainWindow(){
delete ui;
}
void MainWindow::on_startButton_clicked(){
if (m_temperatureThread->isRunning()) {
QMessageBox::warning(this,tr("Warning"),tr("Alarm already started"));
return;
}
bool ok;
m_threshold = ui->thresholdEdit->text().toDouble(&ok);
if (!ok) {
QMessageBox::warning(this,tr("warning"),tr("Invalid"));
return;
}
m_time = 0;
m_timer->start(m_time);
m_temperatureThread->start();
}
void MainWindow::on_stopButton_clicked(){
if (!m_timer->isActive() || !m_temperatureThread->isRunning()) {
QMessageBox::warning(this,tr("Warning"),tr("Alarm not started yet"));
return;
}
m_temperatureThread->quit();
m_temperatureThread->wait();
m_timer->stop();
ui->temperatureLabel->setText(QString::number(0.0));
m_time = 0;
}
void MainWindow::updateTemperature(double temperature){
ui->temperatureLabel->setText(QString::number(temperature));
m_time += 1000;
if (temperature > m_threshold){
QMessageBox::critical(this,tr("Warning"),tr("Temperature too high"));
}
m_timer->setInterval(m_time);
}
```
阅读全文