Add/Update GUI module from wenchun
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env python3
|
||||
from PyQt6.QtWidgets import QTableWidget, QTableWidgetItem, QHeaderView, QLabel
|
||||
from PyQt6.QtCore import Qt
|
||||
|
||||
class OverviewTable(QTableWidget):
|
||||
"""總覽表格,顯示所有無人機的狀態資訊"""
|
||||
|
||||
def __init__(self, info_types, info_type_map, parent=None):
|
||||
super().__init__(parent)
|
||||
|
||||
self.info_types = info_types
|
||||
self.info_type_map = info_type_map
|
||||
self.drones = {} # 存儲無人機面板的引用
|
||||
|
||||
# 初始化表格
|
||||
self.setColumnCount(1)
|
||||
self.setRowCount(len(self.info_types))
|
||||
self.setHorizontalHeaderLabels(["資訊"])
|
||||
header = self.horizontalHeader()
|
||||
header.setSectionResizeMode(0, QHeaderView.ResizeMode.ResizeToContents)
|
||||
self.verticalHeader().setVisible(False)
|
||||
|
||||
# 設置第一列的資訊類型
|
||||
for i, txt in enumerate(self.info_types):
|
||||
item = QTableWidgetItem(txt)
|
||||
item.setFlags(Qt.ItemFlag.ItemIsEnabled)
|
||||
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.setItem(i, 0, item)
|
||||
|
||||
def set_drones(self, drones):
|
||||
"""設置無人機面板字典的引用"""
|
||||
self.drones = drones
|
||||
|
||||
def update_table(self, drone_id=None, field=None, value=None):
|
||||
"""更新總覽表格
|
||||
|
||||
Args:
|
||||
drone_id: 無人機 ID
|
||||
field: 欄位名稱 (如 'mode', 'altitude' 等)
|
||||
value: 要更新的值
|
||||
"""
|
||||
# 更新特定儲存格
|
||||
if drone_id and field and value:
|
||||
if drone_id not in self.drones:
|
||||
return
|
||||
|
||||
col = 1 + list(self.drones.keys()).index(drone_id)
|
||||
row = self.info_type_map.get(field, -1)
|
||||
|
||||
if row == -1:
|
||||
return # 無效的欄位
|
||||
|
||||
item = self.item(row, col)
|
||||
if not item:
|
||||
item = QTableWidgetItem()
|
||||
self.setItem(row, col, item)
|
||||
|
||||
item.setText(value)
|
||||
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
# 如果沒有指定更新,刷新整個表格
|
||||
if drone_id is None:
|
||||
self.refresh_all()
|
||||
|
||||
def refresh_all(self):
|
||||
"""刷新整個表格"""
|
||||
cols = 1 + len(self.drones)
|
||||
self.setColumnCount(cols)
|
||||
headers = ["資訊"] + list(self.drones.keys())
|
||||
self.setHorizontalHeaderLabels(headers)
|
||||
|
||||
for col, did in enumerate(self.drones, start=1):
|
||||
panel = self.drones[did]
|
||||
for field, row in self.info_type_map.items():
|
||||
lbl = panel.findChild(QLabel, f"{did}_{field}")
|
||||
val = lbl.text() if lbl else "--"
|
||||
val_item = QTableWidgetItem(val)
|
||||
val_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.setItem(row, col, val_item)
|
||||
|
||||
def add_drone_column(self, drone_id):
|
||||
"""當新增無人機時,添加一列"""
|
||||
if drone_id in self.drones:
|
||||
self.refresh_all()
|
||||
|
||||
def remove_drone_column(self, drone_id):
|
||||
"""當移除無人機時,刷新表格"""
|
||||
if drone_id in self.drones:
|
||||
self.refresh_all()
|
||||
Reference in New Issue
Block a user