添加了轨道和位置点

This commit is contained in:
jackfiled 2022-07-04 17:09:22 +08:00
parent 73b096aa3d
commit dc7635d8d0
5 changed files with 127 additions and 31 deletions

View File

@ -11,6 +11,26 @@
class PosPair{ class PosPair{
public: public:
/**
* x
*/
static const int stop_begin_x = 100;
/**
* y
*/
static const int stop_begin_y = 80;
/**
*
*/
static const int stop_rail_width = 300;
/**
*
*/
static const int stop_rail_height = 200;
/* /*
* x坐标 * x坐标
*/ */
@ -48,25 +68,6 @@ public:
int GetBusPosY() const; int GetBusPosY() const;
private: private:
/**
* x
*/
const int stop_begin_x = 100;
/**
* y
*/
const int stop_begin_y = 80;
/**
*
*/
const int stop_rail_width = 300;
/**
*
*/
const int stop_rail_height = 200;
/** /**
* *

View File

@ -34,7 +34,7 @@ public:
* *
* @param node_number * @param node_number
*/ */
void SetStopScene(int node_number); void SetStopScene(int node_number, int node_distance);
/** /**
* *
@ -59,6 +59,16 @@ private:
*/ */
QGraphicsSimpleTextItem *name_items; QGraphicsSimpleTextItem *name_items;
/**
*
*/
QGraphicsPathItem *rail_path;
/**
*
*/
QGraphicsEllipseItem *pos_spots;
/** /**
* *
*/ */
@ -74,6 +84,11 @@ private:
*/ */
int stop_node_number; int stop_node_number;
/**
*
*/
int stop_node_distance;
/** /**
* *
* 使scene都能在view的中心 * 使scene都能在view的中心

View File

@ -31,7 +31,8 @@ void CentralWidget::SetController(BusStrategyBase *c)
{ {
controller = c; controller = c;
SetControlConnection(); SetControlConnection();
SetRailsScene(controller->rails_model->node_num); SetRailsScene(controller->rails_model->node_num,
controller->rails_model->total_distance / controller->rails_model->node_num);
} }
void CentralWidget::SetStrategyLabel(int strategy) void CentralWidget::SetStrategyLabel(int strategy)
@ -117,13 +118,13 @@ void CentralWidget::SetWidgetConnection()
void CentralWidget::SetupQueryList() void CentralWidget::SetupQueryList()
{ {
// 设置请求列表的表头 // 设置请求列表的表头
QueryListItem *column_name = new QueryListItem(1,1); auto *column_name = new QueryListItem(1,1);
column_name->SetColumnName(); column_name->SetColumnName();
query_items.push_back(column_name); query_items.push_back(column_name);
// 在列表中显示 // 在列表中显示
QListWidgetItem *widget_item = new QListWidgetItem; auto *widget_item = new QListWidgetItem;
ui->query_list->addItem(widget_item); ui->query_list->addItem(widget_item);
ui->query_list->setItemWidget(widget_item, column_name); ui->query_list->setItemWidget(widget_item, column_name);
} }
@ -159,12 +160,12 @@ void CentralWidget::AppendQueryItemSlot(int query_type, int node_id)
return; return;
} }
QueryListItem *item = new QueryListItem(query_type, node_id); auto *item = new QueryListItem(query_type, node_id);
query_items.push_back(item); query_items.push_back(item);
// 在列表中显示 // 在列表中显示
QListWidgetItem *widget_item = new QListWidgetItem; auto *widget_item = new QListWidgetItem;
ui->query_list->addItem(widget_item); ui->query_list->addItem(widget_item);
ui->query_list->setItemWidget(widget_item, item); ui->query_list->setItemWidget(widget_item, item);
} }
@ -231,9 +232,9 @@ void CentralWidget::AddQueryButtonClicked()
emit AppendQuerySignal(query_type, node_id); emit AppendQuerySignal(query_type, node_id);
} }
void CentralWidget::SetRailsScene(int node_num) void CentralWidget::SetRailsScene(int node_num, int node_distance)
{ {
scene_manager->SetStopScene(node_num); scene_manager->SetStopScene(node_num, node_distance);
SetRailsComboBox(node_num); SetRailsComboBox(node_num);
} }

View File

@ -143,7 +143,7 @@ private:
* *
* @param node_num * @param node_num
*/ */
void SetRailsScene(int node_num); void SetRailsScene(int node_num, int node_distance);
}; };

View File

@ -8,9 +8,12 @@ SceneManager::SceneManager()
{ {
scene = new QGraphicsScene; scene = new QGraphicsScene;
stop_node_number = 0; stop_node_number = 0;
stop_node_distance = 0;
pixmap_items = nullptr; pixmap_items = nullptr;
stop_pos_pairs = nullptr; stop_pos_pairs = nullptr;
name_items = nullptr; name_items = nullptr;
pos_spots = nullptr;
rail_path = nullptr;
rect_item = new QGraphicsRectItem; rect_item = new QGraphicsRectItem;
bus = new BusWidget; bus = new BusWidget;
@ -24,24 +27,31 @@ SceneManager::~SceneManager()
delete []name_items; delete []name_items;
delete []pixmap_items; delete []pixmap_items;
delete []stop_pos_pairs; delete []stop_pos_pairs;
delete []pos_spots;
delete rail_path;
delete bus; delete bus;
delete rect_item;
delete scene; delete scene;
} }
void SceneManager::SetStopScene(int node_number) void SceneManager::SetStopScene(int node_number, int node_distance)
{ {
// 先清除屏幕 // 先清除屏幕
ClearStopScene(); ClearStopScene();
stop_node_number = node_number; stop_node_number = node_number;
stop_node_distance = node_distance;
pixmap_items = new QGraphicsPixmapItem[stop_node_number]; pixmap_items = new QGraphicsPixmapItem[stop_node_number];
stop_pos_pairs = new PosPair[stop_node_number]; stop_pos_pairs = new PosPair[stop_node_number];
name_items = new QGraphicsSimpleTextItem[stop_node_number]; name_items = new QGraphicsSimpleTextItem[stop_node_number];
pos_spots = new QGraphicsEllipseItem[stop_node_number * (node_distance - 1)];
rail_path = new QGraphicsPathItem;
int stop_space_length = stop_pos_pairs->GetStopSpaceLength(stop_node_number); int stop_space_length = stop_pos_pairs->GetStopSpaceLength(stop_node_number);
double stop_scale = 0.15; double stop_scale = 0.15;
QTransform stop_transform; QTransform stop_transform;
stop_transform.scale(stop_scale, stop_scale); stop_transform.scale(stop_scale, stop_scale);
// 为站点对象设置 // 为站点对象设置
@ -64,6 +74,7 @@ void SceneManager::SetStopScene(int node_number)
pixmap_items[i].setPos(stop_pos_pairs[i].pos_x, stop_pos_pairs[i].pos_y); pixmap_items[i].setPos(stop_pos_pairs[i].pos_x, stop_pos_pairs[i].pos_y);
} }
// 初始化站点编号
for(int i = 0; i < stop_node_number; i++) for(int i = 0; i < stop_node_number; i++)
{ {
name_items[i].setText(QString::number(i + 1)); name_items[i].setText(QString::number(i + 1));
@ -72,6 +83,60 @@ void SceneManager::SetStopScene(int node_number)
scene->addItem(&name_items[i]); scene->addItem(&name_items[i]);
} }
// 设置画点的画笔
QPen pen = QPen();
pen.setWidth(2);
pen.setColor(Qt::black);
// 设置画轨道的画笔
QPen rail_pen = QPen();
rail_pen.setWidth(1);
rail_pen.setColor(Qt::black);
// 画轨道
QPainterPath path;
path.moveTo(PosPair::stop_begin_x, PosPair::stop_begin_y);
// 画位置点
int pos;
for(int i = 0; i < stop_node_number; i++)
{
path.lineTo(stop_pos_pairs[i].pos_x, stop_pos_pairs[i].pos_y);
// 处理在画最后一个点的时候数组越界的问题
int next_id = i + 1;
if(next_id == stop_node_number)
{
next_id = 0;
}
int x_distance = (stop_pos_pairs[next_id].pos_x - stop_pos_pairs[i].pos_x) / node_distance;
int y_distance = (stop_pos_pairs[next_id].pos_y - stop_pos_pairs[i].pos_y) / node_distance;
int spot_pos_x = stop_pos_pairs[i].pos_x;
int spot_pos_y = stop_pos_pairs[i].pos_y;
for(int j = 0; j < node_distance - 1; j++)
{
pos = i * (node_distance - 1) + j;
spot_pos_x += x_distance;
spot_pos_y += y_distance;
pos_spots[pos].setPen(pen);
pos_spots[pos].setBrush(QBrush(Qt::black));
pos_spots[pos].setRect(spot_pos_x - 1, spot_pos_y - 1, 2, 2);
scene->addItem(&pos_spots[pos]);
}
}
// 最后在连回起点
path.lineTo(PosPair::stop_begin_x, PosPair::stop_begin_y);
rail_path->setPath(path);
rail_path->setPen(rail_pen);
scene->addItem(rail_path);
// 设置公交车图像 // 设置公交车图像
bus->ResetBusPos(stop_pos_pairs, node_number); bus->ResetBusPos(stop_pos_pairs, node_number);
scene->addItem(bus->item); scene->addItem(bus->item);
@ -79,7 +144,6 @@ void SceneManager::SetStopScene(int node_number)
void SceneManager::ResetBus() void SceneManager::ResetBus()
{ {
bus->ResetBusPos(stop_pos_pairs, stop_node_number); bus->ResetBusPos(stop_pos_pairs, stop_node_number);
} }
@ -91,14 +155,29 @@ void SceneManager::ClearStopScene()
scene->removeItem(&pixmap_items[i]); scene->removeItem(&pixmap_items[i]);
} }
// 移除站点编号
for(int i = 0; i < stop_node_number; i++) for(int i = 0; i < stop_node_number; i++)
{ {
scene->removeItem(&name_items[i]); scene->removeItem(&name_items[i]);
} }
// 移除位置点
for(int i = 0; i < stop_node_number * (stop_node_distance - 1); i++)
{
scene->removeItem(&pos_spots[i]);
}
// 移除轨道
if(rail_path != nullptr)
{
scene->removeItem(rail_path);
}
delete []name_items; delete []name_items;
delete []pixmap_items; delete []pixmap_items;
delete []pos_spots;
delete []stop_pos_pairs; delete []stop_pos_pairs;
delete rail_path;
} }
void SceneManager::BeginBusAnimation(int direction, int duration) void SceneManager::BeginBusAnimation(int direction, int duration)