auto_bus/src/centralwidget.cpp

179 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by ricardo on 2022/6/10.
//
// You may need to build the project (run Qt uic code generator) to get "ui_CentralWidget.h" resolved
#include "header/moc_centralwidget.cpp"
#include "form/ui_CentralWidget.h"
CentralWidget::CentralWidget(QWidget *parent) : QWidget(parent), ui(new Ui::CentralWidget)
{
ui->setupUi(this);
scene_manager = new SceneManager;
ui->main_canva->setScene(scene_manager->scene);
SetWidgetConnection();
SetupQueryList();
}
CentralWidget::~CentralWidget()
{
DeleteQueryList();
delete scene_manager;
delete ui;
}
void CentralWidget::SetController(BusStrategyBase *c)
{
controller = c;
SetControlConnection();
SetRailsScene(controller->rails_model->node_num);
}
void CentralWidget::SetControlConnection()
{
// 设置添加请求事件的连接
QObject::connect(this, &CentralWidget::AppendQuerySignal,
controller, &BusStrategyBase::AppendQuerySlot);
// 设置删除请求事件的连接
QObject::connect(controller, &BusStrategyBase::DeleteQuerySignal,
this, &CentralWidget::DeleteQueryItemSlot);
// 设置打印状态事件的连接
QObject::connect(controller, &BusStrategyBase::PrintStateSignal,
this, &CentralWidget::PrintStateSlot);
QObject::connect(controller, &BusStrategyBase::BusRunningSignal,
this, &CentralWidget::BeginBusAnimationSlot);
}
void CentralWidget::SetWidgetConnection()
{
// 处理点击创建请求按钮事件
QObject::connect(ui->create_query_button, &QPushButton::clicked,
this, &CentralWidget::AddQueryButtonClicked);
// 处理添加请求事件
QObject::connect(this, &CentralWidget::AppendQuerySignal,
this, &CentralWidget::AppendQueryItemSlot);
}
void CentralWidget::SetupQueryList()
{
// 设置请求列表的表头
QueryListItem *column_name = new QueryListItem(1,1);
column_name->SetColumnName();
query_items.push_back(column_name);
// 在列表中显示
QListWidgetItem *widget_item = new QListWidgetItem;
ui->query_list->addItem(widget_item);
ui->query_list->setItemWidget(widget_item, column_name);
}
void CentralWidget::DeleteQueryList()
{
for(auto itor = query_items.begin(); itor != query_items.end(); ++itor)
{
delete *itor;
}
query_items.clear();
}
void CentralWidget::AppendQueryItemSlot(int query_type, int node_id)
{
QueryListItem *item = new QueryListItem(query_type, node_id);
query_items.push_back(item);
// 在列表中显示
QListWidgetItem *widget_item = new QListWidgetItem;
ui->query_list->addItem(widget_item);
ui->query_list->setItemWidget(widget_item, item);
}
void CentralWidget::DeleteQueryItemSlot(int query_type, int node_id)
{
// 由于请求列表头的存在编号从1开始
int query_id = 1;
// 先排除表头的影响
auto first_item = query_items.begin();
first_item++;
for(auto itor = first_item; itor != query_items.end(); ++itor)
{
if((*itor)->query_type == query_type and (*itor)->target_node_id == node_id)
{
break;
}
query_id++;
}
QListWidgetItem *deleted_item = ui->query_list->takeItem(query_id);
auto pos = query_items.begin();
for(int i = 0; i < query_id; i++)
{
++pos;
}
delete deleted_item;
delete *pos;
query_items.erase(pos);
}
void CentralWidget::PrintStateSlot(const QString& string)
{
ui->text_output->insertPlainText(string);
// 设置光标在最后一行
QTextCursor cursor = ui->text_output->textCursor();
cursor.movePosition(QTextCursor::End);
ui->text_output->setTextCursor(cursor);
}
void CentralWidget::BeginBusAnimationSlot(int direction, int duration)
{
scene_manager->BeginBusAnimation(direction, duration);
}
void CentralWidget::AddQueryButtonClicked()
{
int query_type = ui->query_type_combo->currentIndex();
int node_id = ui->query_node_combo->currentIndex() + 1;
if(node_id == 0)
{
//此时还没有读取配置文件
QMessageBox::warning(this, "警告", "请先读取配置文件");
return;
}
emit AppendQuerySignal(query_type, node_id);
}
void CentralWidget::SetRailsScene(int node_num)
{
scene_manager->SetStopScene(node_num);
SetRailsComboBox(node_num);
}
void CentralWidget::SetRailsComboBox(int node_num)
{
ui->query_node_combo->clear();
for(int i = 1; i <= node_num; i++)
{
QString node_str = QString::asprintf("第%d站", i);
ui->query_node_combo->addItem(node_str);
}
}