Binary file not shown.
@ -0,0 +1 @@
|
||||
# 指挥控制中心包
|
||||
@ -0,0 +1,67 @@
|
||||
import sys
|
||||
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
|
||||
QHBoxLayout, QTabWidget, QPushButton, QLabel,
|
||||
QGroupBox, QComboBox, QSpinBox, QDoubleSpinBox,
|
||||
QProgressBar, QCheckBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QFont
|
||||
from ui.login_view import LoginView
|
||||
from ui.main_view import MainView
|
||||
from ui.map_view import MapView
|
||||
from ui.threat_layer_view import ThreatLayerView
|
||||
from ui.path_layer_view import PathLayerView
|
||||
from ui.drone_list_view import DroneListView
|
||||
from ui.drone_detail_view import DroneDetailView
|
||||
from ui.status_dashboard import StatusDashboard
|
||||
from ui.path_planning_view import PathPlanningView
|
||||
from ui.algorithm_config_view import AlgorithmConfigView
|
||||
from ui.path_simulation_view import PathSimulationView
|
||||
|
||||
class CommandCenterApp(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 设置窗口标题和大小
|
||||
self.setWindowTitle("无人机后勤输送系统 - 指挥控制中心")
|
||||
self.setMinimumSize(1200, 800)
|
||||
|
||||
# 创建主窗口部件
|
||||
central_widget = QWidget()
|
||||
self.setCentralWidget(central_widget)
|
||||
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout(central_widget)
|
||||
|
||||
# 创建标签页
|
||||
self.tab_widget = QTabWidget()
|
||||
|
||||
# 添加各个功能标签页
|
||||
self.tab_widget.addTab(MapView(), "地图视图")
|
||||
self.tab_widget.addTab(ThreatLayerView(), "威胁层")
|
||||
self.tab_widget.addTab(PathLayerView(), "路径层")
|
||||
self.tab_widget.addTab(DroneListView(), "无人机列表")
|
||||
self.tab_widget.addTab(DroneDetailView(), "无人机详情")
|
||||
self.tab_widget.addTab(StatusDashboard(), "状态仪表板")
|
||||
self.tab_widget.addTab(PathPlanningView(), "路径规划")
|
||||
self.tab_widget.addTab(AlgorithmConfigView(), "算法配置")
|
||||
self.tab_widget.addTab(PathSimulationView(), "路径模拟")
|
||||
|
||||
main_layout.addWidget(self.tab_widget)
|
||||
|
||||
# 显示登录窗口
|
||||
self.show_login()
|
||||
|
||||
def show_login(self):
|
||||
self.login_view = LoginView()
|
||||
self.login_view.show()
|
||||
|
||||
# 连接登录成功信号
|
||||
# TODO: 实现登录成功后的处理逻辑
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QApplication(sys.argv)
|
||||
window = CommandCenterApp()
|
||||
window.show()
|
||||
sys.exit(app.exec_())
|
||||
@ -0,0 +1 @@
|
||||
# UI组件包
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,103 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QGroupBox, QFormLayout, QComboBox,
|
||||
QSpinBox, QDoubleSpinBox, QCheckBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
class AlgorithmConfigView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建A*算法配置组
|
||||
astar_group = QGroupBox("A*算法配置")
|
||||
astar_layout = QFormLayout()
|
||||
|
||||
self.astar_heuristic = QComboBox()
|
||||
self.astar_heuristic.addItems(["欧几里得距离", "曼哈顿距离", "对角线距离"])
|
||||
|
||||
self.astar_weight = QDoubleSpinBox()
|
||||
self.astar_weight.setRange(0.1, 10.0)
|
||||
self.astar_weight.setValue(1.0)
|
||||
self.astar_weight.setSingleStep(0.1)
|
||||
|
||||
astar_layout.addRow("启发函数:", self.astar_heuristic)
|
||||
astar_layout.addRow("权重:", self.astar_weight)
|
||||
|
||||
astar_group.setLayout(astar_layout)
|
||||
main_layout.addWidget(astar_group)
|
||||
|
||||
# 创建遗传算法配置组
|
||||
ga_group = QGroupBox("遗传算法配置")
|
||||
ga_layout = QFormLayout()
|
||||
|
||||
self.ga_population = QSpinBox()
|
||||
self.ga_population.setRange(10, 1000)
|
||||
self.ga_population.setValue(100)
|
||||
|
||||
self.ga_generations = QSpinBox()
|
||||
self.ga_generations.setRange(10, 1000)
|
||||
self.ga_generations.setValue(100)
|
||||
|
||||
self.ga_mutation_rate = QDoubleSpinBox()
|
||||
self.ga_mutation_rate.setRange(0.01, 1.0)
|
||||
self.ga_mutation_rate.setValue(0.1)
|
||||
self.ga_mutation_rate.setSingleStep(0.01)
|
||||
|
||||
ga_layout.addRow("种群大小:", self.ga_population)
|
||||
ga_layout.addRow("迭代次数:", self.ga_generations)
|
||||
ga_layout.addRow("变异率:", self.ga_mutation_rate)
|
||||
|
||||
ga_group.setLayout(ga_layout)
|
||||
main_layout.addWidget(ga_group)
|
||||
|
||||
# 创建RRT算法配置组
|
||||
rrt_group = QGroupBox("RRT算法配置")
|
||||
rrt_layout = QFormLayout()
|
||||
|
||||
self.rrt_step_size = QDoubleSpinBox()
|
||||
self.rrt_step_size.setRange(0.1, 10.0)
|
||||
self.rrt_step_size.setValue(1.0)
|
||||
self.rrt_step_size.setSingleStep(0.1)
|
||||
|
||||
self.rrt_goal_bias = QDoubleSpinBox()
|
||||
self.rrt_goal_bias.setRange(0.0, 1.0)
|
||||
self.rrt_goal_bias.setValue(0.1)
|
||||
self.rrt_goal_bias.setSingleStep(0.01)
|
||||
|
||||
self.rrt_smooth_path = QCheckBox("平滑路径")
|
||||
self.rrt_smooth_path.setChecked(True)
|
||||
|
||||
rrt_layout.addRow("步长:", self.rrt_step_size)
|
||||
rrt_layout.addRow("目标偏向:", self.rrt_goal_bias)
|
||||
rrt_layout.addRow("", self.rrt_smooth_path)
|
||||
|
||||
rrt_group.setLayout(rrt_layout)
|
||||
main_layout.addWidget(rrt_group)
|
||||
|
||||
# 创建控制按钮
|
||||
button_layout = QHBoxLayout()
|
||||
self.save_config_btn = QPushButton("保存配置")
|
||||
self.reset_config_btn = QPushButton("重置配置")
|
||||
|
||||
button_layout.addWidget(self.save_config_btn)
|
||||
button_layout.addWidget(self.reset_config_btn)
|
||||
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.save_config_btn.clicked.connect(self.save_config)
|
||||
self.reset_config_btn.clicked.connect(self.reset_config)
|
||||
|
||||
def save_config(self):
|
||||
# TODO: 实现保存配置功能
|
||||
pass
|
||||
|
||||
def reset_config(self):
|
||||
# TODO: 实现重置配置功能
|
||||
pass
|
||||
@ -0,0 +1,84 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QGroupBox, QFormLayout)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
class DroneDetailView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建基本信息组
|
||||
basic_info_group = QGroupBox("基本信息")
|
||||
basic_layout = QFormLayout()
|
||||
|
||||
self.id_label = QLabel("")
|
||||
self.model_label = QLabel("")
|
||||
self.status_label = QLabel("")
|
||||
self.battery_label = QLabel("")
|
||||
|
||||
basic_layout.addRow("ID:", self.id_label)
|
||||
basic_layout.addRow("型号:", self.model_label)
|
||||
basic_layout.addRow("状态:", self.status_label)
|
||||
basic_layout.addRow("电量:", self.battery_label)
|
||||
|
||||
basic_info_group.setLayout(basic_layout)
|
||||
main_layout.addWidget(basic_info_group)
|
||||
|
||||
# 创建位置信息组
|
||||
position_group = QGroupBox("位置信息")
|
||||
position_layout = QFormLayout()
|
||||
|
||||
self.latitude_label = QLabel("")
|
||||
self.longitude_label = QLabel("")
|
||||
self.altitude_label = QLabel("")
|
||||
self.speed_label = QLabel("")
|
||||
|
||||
position_layout.addRow("纬度:", self.latitude_label)
|
||||
position_layout.addRow("经度:", self.longitude_label)
|
||||
position_layout.addRow("高度:", self.altitude_label)
|
||||
position_layout.addRow("速度:", self.speed_label)
|
||||
|
||||
position_group.setLayout(position_layout)
|
||||
main_layout.addWidget(position_group)
|
||||
|
||||
# 创建控制按钮
|
||||
button_layout = QHBoxLayout()
|
||||
self.takeoff_btn = QPushButton("起飞")
|
||||
self.land_btn = QPushButton("降落")
|
||||
self.return_btn = QPushButton("返航")
|
||||
self.emergency_btn = QPushButton("紧急停止")
|
||||
|
||||
button_layout.addWidget(self.takeoff_btn)
|
||||
button_layout.addWidget(self.land_btn)
|
||||
button_layout.addWidget(self.return_btn)
|
||||
button_layout.addWidget(self.emergency_btn)
|
||||
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.takeoff_btn.clicked.connect(self.takeoff)
|
||||
self.land_btn.clicked.connect(self.land)
|
||||
self.return_btn.clicked.connect(self.return_home)
|
||||
self.emergency_btn.clicked.connect(self.emergency_stop)
|
||||
|
||||
def takeoff(self):
|
||||
# TODO: 实现起飞功能
|
||||
pass
|
||||
|
||||
def land(self):
|
||||
# TODO: 实现降落功能
|
||||
pass
|
||||
|
||||
def return_home(self):
|
||||
# TODO: 实现返航功能
|
||||
pass
|
||||
|
||||
def emergency_stop(self):
|
||||
# TODO: 实现紧急停止功能
|
||||
pass
|
||||
@ -0,0 +1,57 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QTableWidget, QTableWidgetItem)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
class DroneListView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建无人机列表
|
||||
self.drone_table = QTableWidget()
|
||||
self.drone_table.setColumnCount(5)
|
||||
self.drone_table.setHorizontalHeaderLabels(["ID", "型号", "状态", "位置", "电量"])
|
||||
self.drone_table.setStyleSheet("QTableWidget { border: 1px solid #ccc; }")
|
||||
main_layout.addWidget(self.drone_table)
|
||||
|
||||
# 创建控制按钮
|
||||
button_layout = QHBoxLayout()
|
||||
self.add_drone_btn = QPushButton("添加无人机")
|
||||
self.edit_drone_btn = QPushButton("编辑信息")
|
||||
self.delete_drone_btn = QPushButton("删除无人机")
|
||||
self.refresh_btn = QPushButton("刷新状态")
|
||||
|
||||
button_layout.addWidget(self.add_drone_btn)
|
||||
button_layout.addWidget(self.edit_drone_btn)
|
||||
button_layout.addWidget(self.delete_drone_btn)
|
||||
button_layout.addWidget(self.refresh_btn)
|
||||
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.add_drone_btn.clicked.connect(self.add_drone)
|
||||
self.edit_drone_btn.clicked.connect(self.edit_drone)
|
||||
self.delete_drone_btn.clicked.connect(self.delete_drone)
|
||||
self.refresh_btn.clicked.connect(self.refresh_status)
|
||||
|
||||
def add_drone(self):
|
||||
# TODO: 实现添加无人机功能
|
||||
pass
|
||||
|
||||
def edit_drone(self):
|
||||
# TODO: 实现编辑无人机信息功能
|
||||
pass
|
||||
|
||||
def delete_drone(self):
|
||||
# TODO: 实现删除无人机功能
|
||||
pass
|
||||
|
||||
def refresh_status(self):
|
||||
# TODO: 实现刷新状态功能
|
||||
pass
|
||||
@ -0,0 +1,69 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QLineEdit, QPushButton, QMessageBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QFont
|
||||
|
||||
class LoginView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("无人机后勤输送系统 - 登录")
|
||||
self.setFixedSize(400, 300)
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
main_layout.setAlignment(Qt.AlignCenter)
|
||||
main_layout.setSpacing(20)
|
||||
|
||||
# 标题
|
||||
title_label = QLabel("无人机后勤输送系统")
|
||||
title_label.setFont(QFont('Arial', 16, QFont.Bold))
|
||||
title_label.setAlignment(Qt.AlignCenter)
|
||||
main_layout.addWidget(title_label)
|
||||
|
||||
# 用户名输入
|
||||
username_layout = QHBoxLayout()
|
||||
username_label = QLabel("用户名:")
|
||||
self.username_input = QLineEdit()
|
||||
self.username_input.setPlaceholderText("请输入用户名")
|
||||
username_layout.addWidget(username_label)
|
||||
username_layout.addWidget(self.username_input)
|
||||
main_layout.addLayout(username_layout)
|
||||
|
||||
# 密码输入
|
||||
password_layout = QHBoxLayout()
|
||||
password_label = QLabel("密码:")
|
||||
self.password_input = QLineEdit()
|
||||
self.password_input.setPlaceholderText("请输入密码")
|
||||
self.password_input.setEchoMode(QLineEdit.Password)
|
||||
password_layout.addWidget(password_label)
|
||||
password_layout.addWidget(self.password_input)
|
||||
main_layout.addLayout(password_layout)
|
||||
|
||||
# 按钮区域
|
||||
button_layout = QHBoxLayout()
|
||||
login_button = QPushButton("登录")
|
||||
register_button = QPushButton("注册")
|
||||
login_button.clicked.connect(self.handle_login)
|
||||
register_button.clicked.connect(self.handle_register)
|
||||
button_layout.addWidget(login_button)
|
||||
button_layout.addWidget(register_button)
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
def handle_login(self):
|
||||
username = self.username_input.text()
|
||||
password = self.password_input.text()
|
||||
|
||||
if not username or not password:
|
||||
QMessageBox.warning(self, "错误", "请输入用户名和密码")
|
||||
return
|
||||
|
||||
# TODO: 实现实际的登录逻辑
|
||||
print(f"尝试登录 - 用户名: {username}, 密码: {password}")
|
||||
|
||||
def handle_register(self):
|
||||
# TODO: 实现注册功能
|
||||
QMessageBox.information(self, "提示", "注册功能待实现")
|
||||
@ -0,0 +1,87 @@
|
||||
from PyQt5.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QLabel, QPushButton, QTabWidget, QMessageBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QFont
|
||||
|
||||
class MainView(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("无人机后勤输送系统 - 指挥控制中心")
|
||||
self.setMinimumSize(800, 600)
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主窗口部件
|
||||
central_widget = QWidget()
|
||||
self.setCentralWidget(central_widget)
|
||||
main_layout = QVBoxLayout(central_widget)
|
||||
|
||||
# 顶部工具栏
|
||||
toolbar = QHBoxLayout()
|
||||
self.status_label = QLabel("系统状态: 正常")
|
||||
self.status_label.setFont(QFont('Arial', 10))
|
||||
logout_button = QPushButton("退出登录")
|
||||
logout_button.clicked.connect(self.handle_logout)
|
||||
|
||||
toolbar.addWidget(self.status_label)
|
||||
toolbar.addStretch()
|
||||
toolbar.addWidget(logout_button)
|
||||
main_layout.addLayout(toolbar)
|
||||
|
||||
# 主内容区域
|
||||
self.tab_widget = QTabWidget()
|
||||
|
||||
# 创建各个功能标签页
|
||||
self.tab_widget.addTab(self.create_drone_management_tab(), "无人机管理")
|
||||
self.tab_widget.addTab(self.create_task_management_tab(), "任务管理")
|
||||
self.tab_widget.addTab(self.create_monitoring_tab(), "实时监控")
|
||||
self.tab_widget.addTab(self.create_system_settings_tab(), "系统设置")
|
||||
|
||||
main_layout.addWidget(self.tab_widget)
|
||||
|
||||
def create_drone_management_tab(self):
|
||||
tab = QWidget()
|
||||
layout = QVBoxLayout(tab)
|
||||
|
||||
# 添加无人机管理相关的控件
|
||||
layout.addWidget(QLabel("无人机管理功能待实现"))
|
||||
|
||||
return tab
|
||||
|
||||
def create_task_management_tab(self):
|
||||
tab = QWidget()
|
||||
layout = QVBoxLayout(tab)
|
||||
|
||||
# 添加任务管理相关的控件
|
||||
layout.addWidget(QLabel("任务管理功能待实现"))
|
||||
|
||||
return tab
|
||||
|
||||
def create_monitoring_tab(self):
|
||||
tab = QWidget()
|
||||
layout = QVBoxLayout(tab)
|
||||
|
||||
# 添加实时监控相关的控件
|
||||
layout.addWidget(QLabel("实时监控功能待实现"))
|
||||
|
||||
return tab
|
||||
|
||||
def create_system_settings_tab(self):
|
||||
tab = QWidget()
|
||||
layout = QVBoxLayout(tab)
|
||||
|
||||
# 添加系统设置相关的控件
|
||||
layout.addWidget(QLabel("系统设置功能待实现"))
|
||||
|
||||
return tab
|
||||
|
||||
def handle_logout(self):
|
||||
reply = QMessageBox.question(self, '确认退出',
|
||||
'确定要退出登录吗?',
|
||||
QMessageBox.Yes | QMessageBox.No,
|
||||
QMessageBox.No)
|
||||
|
||||
if reply == QMessageBox.Yes:
|
||||
# TODO: 实现实际的登出逻辑
|
||||
self.close()
|
||||
# 这里应该触发登录窗口的显示
|
||||
@ -0,0 +1,67 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QToolBar, QAction)
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QIcon
|
||||
|
||||
class MapView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建工具栏
|
||||
toolbar = QToolBar()
|
||||
toolbar.setMovable(False)
|
||||
|
||||
# 添加工具栏按钮
|
||||
zoom_in_action = QAction("放大", self)
|
||||
zoom_out_action = QAction("缩小", self)
|
||||
pan_action = QAction("平移", self)
|
||||
measure_action = QAction("测量", self)
|
||||
|
||||
toolbar.addAction(zoom_in_action)
|
||||
toolbar.addAction(zoom_out_action)
|
||||
toolbar.addAction(pan_action)
|
||||
toolbar.addAction(measure_action)
|
||||
|
||||
main_layout.addWidget(toolbar)
|
||||
|
||||
# 创建地图显示区域
|
||||
self.map_widget = QLabel("地图显示区域")
|
||||
self.map_widget.setAlignment(Qt.AlignCenter)
|
||||
self.map_widget.setStyleSheet("background-color: #f0f0f0; border: 1px solid #ccc;")
|
||||
main_layout.addWidget(self.map_widget)
|
||||
|
||||
# 创建图层控制区域
|
||||
layer_control = QHBoxLayout()
|
||||
self.threat_layer_btn = QPushButton("威胁层")
|
||||
self.path_layer_btn = QPushButton("路径层")
|
||||
self.base_layer_btn = QPushButton("基础层")
|
||||
|
||||
layer_control.addWidget(self.threat_layer_btn)
|
||||
layer_control.addWidget(self.path_layer_btn)
|
||||
layer_control.addWidget(self.base_layer_btn)
|
||||
|
||||
main_layout.addLayout(layer_control)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.threat_layer_btn.clicked.connect(self.toggle_threat_layer)
|
||||
self.path_layer_btn.clicked.connect(self.toggle_path_layer)
|
||||
self.base_layer_btn.clicked.connect(self.toggle_base_layer)
|
||||
|
||||
def toggle_threat_layer(self):
|
||||
# TODO: 实现威胁层的显示/隐藏
|
||||
pass
|
||||
|
||||
def toggle_path_layer(self):
|
||||
# TODO: 实现路径层的显示/隐藏
|
||||
pass
|
||||
|
||||
def toggle_base_layer(self):
|
||||
# TODO: 实现基础层的显示/隐藏
|
||||
pass
|
||||
@ -0,0 +1,63 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QTableWidget, QTableWidgetItem)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
class PathLayerView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建路径列表
|
||||
self.path_table = QTableWidget()
|
||||
self.path_table.setColumnCount(4)
|
||||
self.path_table.setHorizontalHeaderLabels(["ID", "起点", "终点", "状态"])
|
||||
self.path_table.setStyleSheet("QTableWidget { border: 1px solid #ccc; }")
|
||||
main_layout.addWidget(self.path_table)
|
||||
|
||||
# 创建控制按钮
|
||||
button_layout = QHBoxLayout()
|
||||
self.add_path_btn = QPushButton("添加路径")
|
||||
self.edit_path_btn = QPushButton("编辑路径")
|
||||
self.delete_path_btn = QPushButton("删除路径")
|
||||
self.simulate_path_btn = QPushButton("模拟路径")
|
||||
|
||||
button_layout.addWidget(self.add_path_btn)
|
||||
button_layout.addWidget(self.edit_path_btn)
|
||||
button_layout.addWidget(self.delete_path_btn)
|
||||
button_layout.addWidget(self.simulate_path_btn)
|
||||
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
# 创建路径详情区域
|
||||
self.path_detail = QLabel("路径详情")
|
||||
self.path_detail.setAlignment(Qt.AlignCenter)
|
||||
self.path_detail.setStyleSheet("background-color: #f0f0f0; border: 1px solid #ccc;")
|
||||
main_layout.addWidget(self.path_detail)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.add_path_btn.clicked.connect(self.add_path)
|
||||
self.edit_path_btn.clicked.connect(self.edit_path)
|
||||
self.delete_path_btn.clicked.connect(self.delete_path)
|
||||
self.simulate_path_btn.clicked.connect(self.simulate_path)
|
||||
|
||||
def add_path(self):
|
||||
# TODO: 实现添加路径功能
|
||||
pass
|
||||
|
||||
def edit_path(self):
|
||||
# TODO: 实现编辑路径功能
|
||||
pass
|
||||
|
||||
def delete_path(self):
|
||||
# TODO: 实现删除路径功能
|
||||
pass
|
||||
|
||||
def simulate_path(self):
|
||||
# TODO: 实现路径模拟功能
|
||||
pass
|
||||
@ -0,0 +1,88 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QGroupBox, QFormLayout, QComboBox,
|
||||
QSpinBox, QDoubleSpinBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
class PathPlanningView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建算法配置组
|
||||
algorithm_group = QGroupBox("算法配置")
|
||||
algorithm_layout = QFormLayout()
|
||||
|
||||
self.algorithm_combo = QComboBox()
|
||||
self.algorithm_combo.addItems(["A*算法", "遗传算法", "RRT算法"])
|
||||
|
||||
self.max_iterations = QSpinBox()
|
||||
self.max_iterations.setRange(100, 10000)
|
||||
self.max_iterations.setValue(1000)
|
||||
|
||||
self.safety_margin = QDoubleSpinBox()
|
||||
self.safety_margin.setRange(0.1, 10.0)
|
||||
self.safety_margin.setValue(1.0)
|
||||
self.safety_margin.setSingleStep(0.1)
|
||||
|
||||
algorithm_layout.addRow("路径规划算法:", self.algorithm_combo)
|
||||
algorithm_layout.addRow("最大迭代次数:", self.max_iterations)
|
||||
algorithm_layout.addRow("安全距离(m):", self.safety_margin)
|
||||
|
||||
algorithm_group.setLayout(algorithm_layout)
|
||||
main_layout.addWidget(algorithm_group)
|
||||
|
||||
# 创建路径参数组
|
||||
path_group = QGroupBox("路径参数")
|
||||
path_layout = QFormLayout()
|
||||
|
||||
self.start_lat = QDoubleSpinBox()
|
||||
self.start_lon = QDoubleSpinBox()
|
||||
self.end_lat = QDoubleSpinBox()
|
||||
self.end_lon = QDoubleSpinBox()
|
||||
|
||||
for spinbox in [self.start_lat, self.start_lon, self.end_lat, self.end_lon]:
|
||||
spinbox.setRange(-180, 180)
|
||||
spinbox.setDecimals(6)
|
||||
|
||||
path_layout.addRow("起点纬度:", self.start_lat)
|
||||
path_layout.addRow("起点经度:", self.start_lon)
|
||||
path_layout.addRow("终点纬度:", self.end_lat)
|
||||
path_layout.addRow("终点经度:", self.end_lon)
|
||||
|
||||
path_group.setLayout(path_layout)
|
||||
main_layout.addWidget(path_group)
|
||||
|
||||
# 创建控制按钮
|
||||
button_layout = QHBoxLayout()
|
||||
self.plan_path_btn = QPushButton("规划路径")
|
||||
self.clear_path_btn = QPushButton("清除路径")
|
||||
self.export_path_btn = QPushButton("导出路径")
|
||||
|
||||
button_layout.addWidget(self.plan_path_btn)
|
||||
button_layout.addWidget(self.clear_path_btn)
|
||||
button_layout.addWidget(self.export_path_btn)
|
||||
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.plan_path_btn.clicked.connect(self.plan_path)
|
||||
self.clear_path_btn.clicked.connect(self.clear_path)
|
||||
self.export_path_btn.clicked.connect(self.export_path)
|
||||
|
||||
def plan_path(self):
|
||||
# TODO: 实现路径规划功能
|
||||
pass
|
||||
|
||||
def clear_path(self):
|
||||
# TODO: 实现清除路径功能
|
||||
pass
|
||||
|
||||
def export_path(self):
|
||||
# TODO: 实现导出路径功能
|
||||
pass
|
||||
@ -0,0 +1,109 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QGroupBox, QFormLayout, QProgressBar,
|
||||
QSpinBox, QDoubleSpinBox)
|
||||
from PyQt5.QtCore import Qt, QTimer
|
||||
|
||||
class PathSimulationView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
self.simulation_timer = QTimer()
|
||||
self.simulation_timer.timeout.connect(self.update_simulation)
|
||||
self.simulation_progress = 0
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建模拟控制组
|
||||
control_group = QGroupBox("模拟控制")
|
||||
control_layout = QFormLayout()
|
||||
|
||||
self.speed_spinbox = QDoubleSpinBox()
|
||||
self.speed_spinbox.setRange(0.1, 10.0)
|
||||
self.speed_spinbox.setValue(1.0)
|
||||
self.speed_spinbox.setSingleStep(0.1)
|
||||
|
||||
self.interval_spinbox = QSpinBox()
|
||||
self.interval_spinbox.setRange(10, 1000)
|
||||
self.interval_spinbox.setValue(100)
|
||||
self.interval_spinbox.setSingleStep(10)
|
||||
|
||||
control_layout.addRow("模拟速度:", self.speed_spinbox)
|
||||
control_layout.addRow("更新间隔(ms):", self.interval_spinbox)
|
||||
|
||||
control_group.setLayout(control_layout)
|
||||
main_layout.addWidget(control_group)
|
||||
|
||||
# 创建模拟进度条
|
||||
self.progress_bar = QProgressBar()
|
||||
self.progress_bar.setRange(0, 100)
|
||||
self.progress_bar.setValue(0)
|
||||
main_layout.addWidget(self.progress_bar)
|
||||
|
||||
# 创建控制按钮
|
||||
button_layout = QHBoxLayout()
|
||||
self.start_btn = QPushButton("开始模拟")
|
||||
self.pause_btn = QPushButton("暂停")
|
||||
self.stop_btn = QPushButton("停止")
|
||||
self.reset_btn = QPushButton("重置")
|
||||
|
||||
button_layout.addWidget(self.start_btn)
|
||||
button_layout.addWidget(self.pause_btn)
|
||||
button_layout.addWidget(self.stop_btn)
|
||||
button_layout.addWidget(self.reset_btn)
|
||||
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
# 创建状态显示组
|
||||
status_group = QGroupBox("模拟状态")
|
||||
status_layout = QFormLayout()
|
||||
|
||||
self.time_label = QLabel("0.0s")
|
||||
self.distance_label = QLabel("0.0m")
|
||||
self.altitude_label = QLabel("0.0m")
|
||||
self.speed_label = QLabel("0.0m/s")
|
||||
|
||||
status_layout.addRow("已用时间:", self.time_label)
|
||||
status_layout.addRow("飞行距离:", self.distance_label)
|
||||
status_layout.addRow("当前高度:", self.altitude_label)
|
||||
status_layout.addRow("当前速度:", self.speed_label)
|
||||
|
||||
status_group.setLayout(status_layout)
|
||||
main_layout.addWidget(status_group)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.start_btn.clicked.connect(self.start_simulation)
|
||||
self.pause_btn.clicked.connect(self.pause_simulation)
|
||||
self.stop_btn.clicked.connect(self.stop_simulation)
|
||||
self.reset_btn.clicked.connect(self.reset_simulation)
|
||||
|
||||
def start_simulation(self):
|
||||
self.simulation_timer.start(self.interval_spinbox.value())
|
||||
|
||||
def pause_simulation(self):
|
||||
self.simulation_timer.stop()
|
||||
|
||||
def stop_simulation(self):
|
||||
self.simulation_timer.stop()
|
||||
self.simulation_progress = 0
|
||||
self.progress_bar.setValue(0)
|
||||
|
||||
def reset_simulation(self):
|
||||
self.simulation_progress = 0
|
||||
self.progress_bar.setValue(0)
|
||||
self.time_label.setText("0.0s")
|
||||
self.distance_label.setText("0.0m")
|
||||
self.altitude_label.setText("0.0m")
|
||||
self.speed_label.setText("0.0m/s")
|
||||
|
||||
def update_simulation(self):
|
||||
# TODO: 实现模拟更新逻辑
|
||||
self.simulation_progress += self.speed_spinbox.value()
|
||||
if self.simulation_progress > 100:
|
||||
self.simulation_progress = 100
|
||||
self.simulation_timer.stop()
|
||||
|
||||
self.progress_bar.setValue(int(self.simulation_progress))
|
||||
@ -0,0 +1,128 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QProgressBar, QGroupBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QColor, QPalette
|
||||
|
||||
class StatusDashboard(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建系统状态组
|
||||
system_status_group = QGroupBox("系统状态")
|
||||
system_layout = QVBoxLayout()
|
||||
|
||||
# 创建状态指示器
|
||||
self.connection_status = self.create_status_indicator("通信状态", "未连接")
|
||||
self.gps_status = self.create_status_indicator("GPS状态", "未定位")
|
||||
self.battery_status = self.create_battery_indicator("电池状态", 0)
|
||||
self.signal_status = self.create_signal_indicator("信号强度", 0)
|
||||
|
||||
system_layout.addWidget(self.connection_status)
|
||||
system_layout.addWidget(self.gps_status)
|
||||
system_layout.addWidget(self.battery_status)
|
||||
system_layout.addWidget(self.signal_status)
|
||||
|
||||
system_status_group.setLayout(system_layout)
|
||||
main_layout.addWidget(system_status_group)
|
||||
|
||||
# 创建性能指标组
|
||||
performance_group = QGroupBox("性能指标")
|
||||
performance_layout = QVBoxLayout()
|
||||
|
||||
self.cpu_usage = self.create_progress_bar("CPU使用率", 0)
|
||||
self.memory_usage = self.create_progress_bar("内存使用率", 0)
|
||||
self.network_usage = self.create_progress_bar("网络使用率", 0)
|
||||
|
||||
performance_layout.addWidget(self.cpu_usage)
|
||||
performance_layout.addWidget(self.memory_usage)
|
||||
performance_layout.addWidget(self.network_usage)
|
||||
|
||||
performance_group.setLayout(performance_layout)
|
||||
main_layout.addWidget(performance_group)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
def create_status_indicator(self, label_text, status_text):
|
||||
widget = QWidget()
|
||||
layout = QHBoxLayout()
|
||||
|
||||
label = QLabel(label_text)
|
||||
status = QLabel(status_text)
|
||||
status.setStyleSheet("color: red;")
|
||||
|
||||
layout.addWidget(label)
|
||||
layout.addWidget(status)
|
||||
layout.addStretch()
|
||||
|
||||
widget.setLayout(layout)
|
||||
return widget
|
||||
|
||||
def create_battery_indicator(self, label_text, value):
|
||||
widget = QWidget()
|
||||
layout = QHBoxLayout()
|
||||
|
||||
label = QLabel(label_text)
|
||||
progress = QProgressBar()
|
||||
progress.setValue(value)
|
||||
progress.setStyleSheet("""
|
||||
QProgressBar {
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
QProgressBar::chunk {
|
||||
background-color: #4CAF50;
|
||||
}
|
||||
""")
|
||||
|
||||
layout.addWidget(label)
|
||||
layout.addWidget(progress)
|
||||
layout.addStretch()
|
||||
|
||||
widget.setLayout(layout)
|
||||
return widget
|
||||
|
||||
def create_signal_indicator(self, label_text, value):
|
||||
widget = QWidget()
|
||||
layout = QHBoxLayout()
|
||||
|
||||
label = QLabel(label_text)
|
||||
progress = QProgressBar()
|
||||
progress.setValue(value)
|
||||
progress.setStyleSheet("""
|
||||
QProgressBar {
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
QProgressBar::chunk {
|
||||
background-color: #2196F3;
|
||||
}
|
||||
""")
|
||||
|
||||
layout.addWidget(label)
|
||||
layout.addWidget(progress)
|
||||
layout.addStretch()
|
||||
|
||||
widget.setLayout(layout)
|
||||
return widget
|
||||
|
||||
def create_progress_bar(self, label_text, value):
|
||||
widget = QWidget()
|
||||
layout = QHBoxLayout()
|
||||
|
||||
label = QLabel(label_text)
|
||||
progress = QProgressBar()
|
||||
progress.setValue(value)
|
||||
|
||||
layout.addWidget(label)
|
||||
layout.addWidget(progress)
|
||||
layout.addStretch()
|
||||
|
||||
widget.setLayout(layout)
|
||||
return widget
|
||||
@ -0,0 +1,56 @@
|
||||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
||||
QPushButton, QTableWidget, QTableWidgetItem)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
class ThreatLayerView(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout()
|
||||
|
||||
# 创建威胁列表
|
||||
self.threat_table = QTableWidget()
|
||||
self.threat_table.setColumnCount(4)
|
||||
self.threat_table.setHorizontalHeaderLabels(["ID", "类型", "位置", "威胁等级"])
|
||||
self.threat_table.setStyleSheet("QTableWidget { border: 1px solid #ccc; }")
|
||||
main_layout.addWidget(self.threat_table)
|
||||
|
||||
# 创建控制按钮
|
||||
button_layout = QHBoxLayout()
|
||||
self.add_threat_btn = QPushButton("添加威胁")
|
||||
self.edit_threat_btn = QPushButton("编辑威胁")
|
||||
self.delete_threat_btn = QPushButton("删除威胁")
|
||||
|
||||
button_layout.addWidget(self.add_threat_btn)
|
||||
button_layout.addWidget(self.edit_threat_btn)
|
||||
button_layout.addWidget(self.delete_threat_btn)
|
||||
|
||||
main_layout.addLayout(button_layout)
|
||||
|
||||
# 创建威胁详情区域
|
||||
self.threat_detail = QLabel("威胁详情")
|
||||
self.threat_detail.setAlignment(Qt.AlignCenter)
|
||||
self.threat_detail.setStyleSheet("background-color: #f0f0f0; border: 1px solid #ccc;")
|
||||
main_layout.addWidget(self.threat_detail)
|
||||
|
||||
self.setLayout(main_layout)
|
||||
|
||||
# 连接信号
|
||||
self.add_threat_btn.clicked.connect(self.add_threat)
|
||||
self.edit_threat_btn.clicked.connect(self.edit_threat)
|
||||
self.delete_threat_btn.clicked.connect(self.delete_threat)
|
||||
|
||||
def add_threat(self):
|
||||
# TODO: 实现添加威胁功能
|
||||
pass
|
||||
|
||||
def edit_threat(self):
|
||||
# TODO: 实现编辑威胁功能
|
||||
pass
|
||||
|
||||
def delete_threat(self):
|
||||
# TODO: 实现删除威胁功能
|
||||
pass
|
||||
Loading…
Reference in new issue