gcode预览测试

This commit is contained in:
2026-05-14 20:21:16 +08:00
parent 65f221a5d8
commit 837996c436
17 changed files with 1363 additions and 296 deletions

View File

@@ -132,6 +132,94 @@ class WifiScanWorker(QObject):
self.scan_error.emit(str(e))
class WifiConnectWorker(QObject):
"""在后台线程中连接新WiFi"""
finished = pyqtSignal(bool, str) # (success, ssid)
error = pyqtSignal(str)
def __init__(self, wifi_manager, auth_mode, ssid, password=None, identity=None):
super().__init__()
self.wifi_manager = wifi_manager
self.auth_mode = auth_mode
self.ssid = ssid
self.password = password
self.identity = identity
def run(self):
try:
if self.auth_mode == "open":
ok = self.wifi_manager.connect_wifi(self.ssid, None)
elif self.auth_mode == "psk":
ok = self.wifi_manager.connect_wifi(self.ssid, self.password)
else:
ok = self.wifi_manager.connect_eap(self.ssid, self.identity, self.password)
self.finished.emit(ok, self.ssid)
except Exception as e:
self.error.emit(str(e))
class WifiConnectSavedWorker(QObject):
"""在后台线程中连接已保存的网络"""
finished = pyqtSignal(bool, str)
error = pyqtSignal(str)
def __init__(self, wifi_manager, network_id, ssid):
super().__init__()
self.wifi_manager = wifi_manager
self.network_id = network_id
self.ssid = ssid
def run(self):
try:
ok = self.wifi_manager.connect_network_id(self.network_id)
self.finished.emit(ok, self.ssid)
except Exception as e:
self.error.emit(str(e))
class WifiRemoveWorker(QObject):
"""在后台线程中删除已保存的网络"""
finished = pyqtSignal(bool, str)
error = pyqtSignal(str)
def __init__(self, wifi_manager, network_id, ssid):
super().__init__()
self.wifi_manager = wifi_manager
self.network_id = network_id
self.ssid = ssid
def run(self):
try:
self.wifi_manager.remove_network(self.network_id)
self.finished.emit(True, self.ssid)
except Exception as e:
self.error.emit(str(e))
class WifiHotspotWorker(QObject):
"""在后台线程中开启/关闭热点"""
finished = pyqtSignal(bool, str)
error = pyqtSignal(str)
def __init__(self, wifi_manager, action, ssid=None, password=None):
super().__init__()
self.wifi_manager = wifi_manager
self.action = action
self.ssid = ssid
self.password = password
def run(self):
try:
if self.action == "open":
ret = self.wifi_manager.open_hotspot(self.ssid, self.password)
self.finished.emit(bool(ret), self.ssid or "")
else:
self.wifi_manager.close_hotspot()
self.finished.emit(True, "")
except Exception as e:
self.error.emit(str(e))
class SettingPage(QWidget):
def __init__(self, api_client, parent=None):
super().__init__(parent)
@@ -451,13 +539,13 @@ class SettingPage(QWidget):
saved_buttons_layout = QHBoxLayout()
saved_buttons_layout.setSpacing(12)
connect_saved_button = QPushButton("连接到此网络")
connect_saved_button.clicked.connect(self.connect_to_saved_wifi)
saved_buttons_layout.addWidget(connect_saved_button)
self.connect_saved_button = QPushButton("连接到此网络")
self.connect_saved_button.clicked.connect(self.connect_to_saved_wifi)
saved_buttons_layout.addWidget(self.connect_saved_button)
remove_saved_button = QPushButton("删除选中")
remove_saved_button.clicked.connect(self.remove_selected_saved_wifi)
saved_buttons_layout.addWidget(remove_saved_button)
self.remove_saved_button = QPushButton("删除选中")
self.remove_saved_button.clicked.connect(self.remove_selected_saved_wifi)
saved_buttons_layout.addWidget(self.remove_saved_button)
wifi_layout.addLayout(saved_buttons_layout)
nearby_title = QLabel("附近网络")
@@ -547,8 +635,8 @@ class SettingPage(QWidget):
wifi_layout.addLayout(form)
# 连接按钮使用醒目的强调色
connect_button = QPushButton("连接")
connect_button.setStyleSheet(
self.connect_button = QPushButton("连接")
self.connect_button.setStyleSheet(
"""
QPushButton {
min-height: 52px;
@@ -570,8 +658,8 @@ class SettingPage(QWidget):
}
"""
)
connect_button.clicked.connect(self.connect_to_wifi)
wifi_layout.addWidget(connect_button)
self.connect_button.clicked.connect(self.connect_to_wifi)
wifi_layout.addWidget(self.connect_button)
wifi_layout.addStretch()
self.settings_stack.addWidget(self._wrap_scroll(wifi_widget))
@@ -722,47 +810,101 @@ class SettingPage(QWidget):
self.hotspot_toggle.setText("OFF")
def _on_hotspot_toggled(self, checked):
# 立即阻塞信号,防止递归触发
self.hotspot_toggle.blockSignals(True)
if checked:
ssid = self.hotspot_ssid.text().strip()
password = self.hotspot_password.text().strip()
if not ssid:
self._styled_message(QMessageBox.Icon.Warning, self, "提示", "请输入热点名称")
self.hotspot_toggle.blockSignals(True)
self.hotspot_toggle.setChecked(False)
self.hotspot_toggle.blockSignals(False)
self._styled_message(QMessageBox.Icon.Warning, self, "提示", "请输入热点名称")
return
if len(password) < 8:
self.hotspot_toggle.setChecked(False)
self.hotspot_toggle.blockSignals(False)
self._styled_message(QMessageBox.Icon.Warning, self, "提示", "密码至少需要8位")
self.hotspot_toggle.blockSignals(True)
self.hotspot_toggle.setChecked(False)
self.hotspot_toggle.blockSignals(False)
return
try:
ret = self.wifi_manager.open_hotspot(ssid, password)
if ret:
self._apply_toggle_style(True)
self.hotspot_status.setText(f"热点状态:已开启 ({ssid})")
self.hotspot_ssid.setEnabled(False)
self.hotspot_password.setEnabled(False)
self._generate_qr_code(ssid, password)
else:
raise RuntimeError("wpa_cli 返回失败")
except Exception as e:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"开启热点失败: {str(e)}")
self.hotspot_toggle.blockSignals(True)
self.hotspot_toggle.setChecked(False)
self.hotspot_toggle.blockSignals(False)
# 按钮UI反馈 → 显示"开启中……"
self.hotspot_toggle.setEnabled(False)
self.hotspot_toggle.setText("开启中……")
self.hotspot_toggle.blockSignals(False)
self._hotspot_thread = QThread()
self._hotspot_worker = WifiHotspotWorker(self.wifi_manager, "open", ssid, password)
self._hotspot_worker.moveToThread(self._hotspot_thread)
self._hotspot_thread.started.connect(self._hotspot_worker.run)
self._hotspot_worker.finished.connect(self._on_hotspot_open_finished)
self._hotspot_worker.error.connect(self._on_hotspot_open_error)
self._hotspot_worker.finished.connect(self._hotspot_thread.quit)
self._hotspot_worker.error.connect(self._hotspot_thread.quit)
self._hotspot_worker.finished.connect(self._hotspot_worker.deleteLater)
self._hotspot_worker.error.connect(self._hotspot_worker.deleteLater)
self._hotspot_thread.finished.connect(self._hotspot_thread.deleteLater)
self._hotspot_thread.start()
else:
try:
self.wifi_manager.close_hotspot()
except Exception:
pass
# 关闭热点
self.hotspot_toggle.setEnabled(False)
self.hotspot_toggle.setText("关闭中……")
self.hotspot_toggle.blockSignals(False)
self._hotspot_thread = QThread()
self._hotspot_worker = WifiHotspotWorker(self.wifi_manager, "close")
self._hotspot_worker.moveToThread(self._hotspot_thread)
self._hotspot_thread.started.connect(self._hotspot_worker.run)
self._hotspot_worker.finished.connect(self._on_hotspot_close_finished)
self._hotspot_worker.error.connect(self._on_hotspot_close_error)
self._hotspot_worker.finished.connect(self._hotspot_thread.quit)
self._hotspot_worker.error.connect(self._hotspot_thread.quit)
self._hotspot_worker.finished.connect(self._hotspot_worker.deleteLater)
self._hotspot_worker.error.connect(self._hotspot_worker.deleteLater)
self._hotspot_thread.finished.connect(self._hotspot_thread.deleteLater)
self._hotspot_thread.start()
def _on_hotspot_open_finished(self, ok, ssid):
if ok:
self._apply_toggle_style(True)
self.hotspot_status.setText(f"热点状态:已开启 ({ssid})")
self.hotspot_ssid.setEnabled(False)
self.hotspot_password.setEnabled(False)
self._generate_qr_code(ssid, self.hotspot_password.text().strip())
else:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", "开启热点失败: wpa_cli 返回失败")
self.hotspot_toggle.blockSignals(True)
self.hotspot_toggle.setChecked(False)
self.hotspot_toggle.blockSignals(False)
self._apply_toggle_style(False)
self.hotspot_status.setText("热点状态:关闭")
self.hotspot_ssid.setEnabled(True)
self.hotspot_password.setEnabled(True)
self.qr_label.clear()
self.qr_hint.setText("开启热点后自动生成二维码")
self.hotspot_toggle.setEnabled(True)
def _on_hotspot_open_error(self, err_msg):
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"开启热点失败: {err_msg}")
self.hotspot_toggle.blockSignals(True)
self.hotspot_toggle.setChecked(False)
self.hotspot_toggle.blockSignals(False)
self._apply_toggle_style(False)
self.hotspot_toggle.setEnabled(True)
def _on_hotspot_close_finished(self, ok, _msg):
self._apply_toggle_style(False)
self.hotspot_status.setText("热点状态:关闭")
self.hotspot_ssid.setEnabled(True)
self.hotspot_password.setEnabled(True)
self.qr_label.clear()
self.qr_hint.setText("开启热点后自动生成二维码")
self.hotspot_toggle.setEnabled(True)
def _on_hotspot_close_error(self, err_msg):
# 关闭失败仍尝试恢复UI
self._apply_toggle_style(False)
self.hotspot_status.setText("热点状态:关闭")
self.hotspot_ssid.setEnabled(True)
self.hotspot_password.setEnabled(True)
self.qr_label.clear()
self.qr_hint.setText("开启热点后自动生成二维码")
self.hotspot_toggle.setEnabled(True)
self._styled_message(QMessageBox.Icon.Warning, self, "提示", f"关闭热点时出现异常: {err_msg}")
def _generate_qr_code(self, ssid, password):
"""生成 WiFi 二维码并显示"""
@@ -943,7 +1085,7 @@ class SettingPage(QWidget):
self.saved_wifi_list.clear()
for network in saved_networks:
item_text = f"[{network.get('network_id', '-')}] {network.get('ssid', '<hidden>')} {network.get('flags', '')}"
item_text = f"{network.get('ssid', '<hidden>')}"
item = QListWidgetItem(item_text)
item.setData(Qt.ItemDataRole.UserRole, network)
self.saved_wifi_list.addItem(item)
@@ -1016,7 +1158,11 @@ class SettingPage(QWidget):
ssid_label = QLabel(decoded_ssid)
ssid_label.setStyleSheet("background: transparent; color: #f2f2f2; font-size: 18px;")
signal_label = QLabel(f"{signal} dBm" if signal else "")
try:
signal = int(signal)
except (ValueError, TypeError):
signal = 0
signal_label = QLabel(f"{signal} dBm" if signal < 0 else f"{signal}%")
signal_label.setStyleSheet("background: transparent; color: #aaaaaa; font-size: 16px;")
item_layout.addWidget(ssid_label)
@@ -1165,7 +1311,7 @@ class SettingPage(QWidget):
self.refresh_current_status()
def connect_to_saved_wifi(self):
"""连接已保存列表中选中的网络"""
"""连接已保存列表中选中的网络(后台线程)"""
item = self.saved_wifi_list.currentItem()
if item is None:
self._styled_message(QMessageBox.Icon.Warning, self, "提示", "请先选择一个已保存网络")
@@ -1176,14 +1322,38 @@ class SettingPage(QWidget):
if network_id is None:
self._styled_message(QMessageBox.Icon.Warning, self, "提示", "选中网络无效")
return
try:
ok = self.wifi_manager.connect_network_id(network_id)
if not ok:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", "连接请求下发失败")
return
self._styled_message(QMessageBox.Icon.Information, self, "成功", f"已发起连接: {ssid}")
except Exception as e:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"连接失败: {str(e)}")
# 按钮UI反馈
self.connect_saved_button.setEnabled(False)
self.connect_saved_button.setText("连接中……")
self._saved_connect_thread = QThread()
self._saved_connect_worker = WifiConnectSavedWorker(self.wifi_manager, network_id, ssid)
self._saved_connect_worker.moveToThread(self._saved_connect_thread)
self._saved_connect_thread.started.connect(self._saved_connect_worker.run)
self._saved_connect_worker.finished.connect(self._on_saved_connect_finished)
self._saved_connect_worker.error.connect(self._on_saved_connect_error)
self._saved_connect_worker.finished.connect(self._saved_connect_thread.quit)
self._saved_connect_worker.error.connect(self._saved_connect_thread.quit)
self._saved_connect_worker.finished.connect(self._saved_connect_worker.deleteLater)
self._saved_connect_worker.error.connect(self._saved_connect_worker.deleteLater)
self._saved_connect_thread.finished.connect(self._saved_connect_thread.deleteLater)
self._saved_connect_thread.start()
def _on_saved_connect_finished(self, ok, ssid):
self.connect_saved_button.setEnabled(True)
self.connect_saved_button.setText("连接到此网络")
if ok:
self._styled_message(QMessageBox.Icon.Information, self, "成功", f"已连接: {ssid}")
else:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", "连接失败")
self.refresh_saved_wifi()
self.refresh_current_status()
def _on_saved_connect_error(self, err_msg):
self.connect_saved_button.setEnabled(True)
self.connect_saved_button.setText("连接到此网络")
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"连接失败: {err_msg}")
def remove_selected_saved_wifi(self):
item = self.saved_wifi_list.currentItem()
@@ -1196,13 +1366,36 @@ class SettingPage(QWidget):
if network_id is None:
self._styled_message(QMessageBox.Icon.Warning, self, "提示", "选中网络无效,无法删除")
return
try:
self.wifi_manager.remove_network(network_id)
# 按钮UI反馈
self.remove_saved_button.setEnabled(False)
self.remove_saved_button.setText("删除中……")
self._remove_thread = QThread()
self._remove_worker = WifiRemoveWorker(self.wifi_manager, network_id, ssid)
self._remove_worker.moveToThread(self._remove_thread)
self._remove_thread.started.connect(self._remove_worker.run)
self._remove_worker.finished.connect(self._on_remove_finished)
self._remove_worker.error.connect(self._on_remove_error)
self._remove_worker.finished.connect(self._remove_thread.quit)
self._remove_worker.error.connect(self._remove_thread.quit)
self._remove_worker.finished.connect(self._remove_worker.deleteLater)
self._remove_worker.error.connect(self._remove_worker.deleteLater)
self._remove_thread.finished.connect(self._remove_thread.deleteLater)
self._remove_thread.start()
def _on_remove_finished(self, ok, ssid):
self.remove_saved_button.setEnabled(True)
self.remove_saved_button.setText("删除选中")
if ok:
self._styled_message(QMessageBox.Icon.Information, self, "成功", f"已删除网络: {ssid}")
self.refresh_saved_wifi()
self.refresh_current_status()
except Exception as e:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"删除失败: {str(e)}")
self.refresh_saved_wifi()
self.refresh_current_status()
def _on_remove_error(self, err_msg):
self.remove_saved_button.setEnabled(True)
self.remove_saved_button.setText("删除选中")
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"删除失败: {err_msg}")
def connect_to_wifi(self):
ssid = self.ssid_input.text().strip()
@@ -1222,23 +1415,37 @@ class SettingPage(QWidget):
self._styled_message(QMessageBox.Icon.Warning, self, "警告", "WPA-EAP 认证需要身份和密码")
return
try:
if auth_mode == "open":
ok = self.wifi_manager.connect_wifi(ssid, None)
elif auth_mode == "psk":
ok = self.wifi_manager.connect_wifi(ssid, password)
else:
ok = self.wifi_manager.connect_eap(ssid, identity, password)
# 按钮UI反馈
self.connect_button.setEnabled(False)
self.connect_button.setText("连接中……")
if not ok:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", "连接请求下发失败,请检查系统日志")
return
self._connect_thread = QThread()
self._connect_worker = WifiConnectWorker(self.wifi_manager, auth_mode, ssid, password, identity)
self._connect_worker.moveToThread(self._connect_thread)
self._connect_thread.started.connect(self._connect_worker.run)
self._connect_worker.finished.connect(self._on_connect_finished)
self._connect_worker.error.connect(self._on_connect_error)
self._connect_worker.finished.connect(self._connect_thread.quit)
self._connect_worker.error.connect(self._connect_thread.quit)
self._connect_worker.finished.connect(self._connect_worker.deleteLater)
self._connect_worker.error.connect(self._connect_worker.deleteLater)
self._connect_thread.finished.connect(self._connect_thread.deleteLater)
self._connect_thread.start()
self._styled_message(QMessageBox.Icon.Information, self, "成功", f"已发起连接: {ssid}")
self.refresh_saved_wifi()
self.refresh_current_status()
except Exception as e:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"连接WiFi失败: {str(e)}")
def _on_connect_finished(self, ok, ssid):
self.connect_button.setEnabled(True)
self.connect_button.setText("连接")
if ok:
self._styled_message(QMessageBox.Icon.Information, self, "成功", f"连接: {ssid}")
else:
self._styled_message(QMessageBox.Icon.Critical, self, "错误", "连接失败")
self.refresh_saved_wifi()
self.refresh_current_status()
def _on_connect_error(self, err_msg):
self.connect_button.setEnabled(True)
self.connect_button.setText("连接")
self._styled_message(QMessageBox.Icon.Critical, self, "错误", f"连接WiFi失败: {err_msg}")
def display_setting(self, index):
if index < 0: