fix: 无设备时填充 Android 空表格 (#5)

This commit is contained in:
chengma
2026-08-06 15:50:47 +08:00
parent 90379347b4
commit 1bc597fbd5
+34 -3
View File
@@ -10,7 +10,7 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import Iterable, Optional from typing import Iterable, Optional
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt, pyqtSignal from PyQt5.QtCore import QAbstractTableModel, QEvent, QModelIndex, Qt, pyqtSignal
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractItemView, QAbstractItemView,
QFormLayout, QFormLayout,
@@ -63,9 +63,12 @@ class AndroidDeviceTableModel(QAbstractTableModel):
super().__init__(parent) super().__init__(parent)
self._rows: list[AndroidDeviceRow] = [] self._rows: list[AndroidDeviceRow] = []
self._checked_serial = "" self._checked_serial = ""
self._placeholder_row_count = 1
def rowCount(self, parent=QModelIndex()) -> int: def rowCount(self, parent=QModelIndex()) -> int:
return 0 if parent.isValid() else len(self._rows) if parent.isValid():
return 0
return len(self._rows) or self._placeholder_row_count
def columnCount(self, parent=QModelIndex()) -> int: def columnCount(self, parent=QModelIndex()) -> int:
return 0 if parent.isValid() else len(self.HEADERS) return 0 if parent.isValid() else len(self.HEADERS)
@@ -107,7 +110,7 @@ class AndroidDeviceTableModel(QAbstractTableModel):
return None return None
def flags(self, index): def flags(self, index):
if not index.isValid(): if not index.isValid() or index.row() >= len(self._rows):
return Qt.NoItemFlags return Qt.NoItemFlags
flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable
@@ -118,6 +121,7 @@ class AndroidDeviceTableModel(QAbstractTableModel):
def setData(self, index, value, role=Qt.EditRole) -> bool: def setData(self, index, value, role=Qt.EditRole) -> bool:
if ( if (
not index.isValid() not index.isValid()
or index.row() >= len(self._rows)
or index.column() != 0 or index.column() != 0
or role != Qt.CheckStateRole or role != Qt.CheckStateRole
or self._rows[index.row()].status != "device" or self._rows[index.row()].status != "device"
@@ -145,6 +149,18 @@ class AndroidDeviceTableModel(QAbstractTableModel):
if checked_serial != self._checked_serial: if checked_serial != self._checked_serial:
self.checkedDeviceChanged.emit(self._checked_serial) self.checkedDeviceChanged.emit(self._checked_serial)
def set_placeholder_row_count(self, count: int) -> None:
"""设置空设备列表占位行数,真实设备行不受影响。"""
count = max(1, count)
if self._rows or count == self._placeholder_row_count:
self._placeholder_row_count = count
return
self.beginResetModel()
self._placeholder_row_count = count
self.endResetModel()
def set_checked_serial(self, serial: str) -> None: def set_checked_serial(self, serial: str) -> None:
"""勾选一台正常设备;传空字符串清除勾选。""" """勾选一台正常设备;传空字符串清除勾选。"""
@@ -235,6 +251,7 @@ class SettingsPage(QWidget):
self.deviceTable.setColumnWidth(1, 210) self.deviceTable.setColumnWidth(1, 210)
self.deviceTable.setColumnWidth(2, 96) self.deviceTable.setColumnWidth(2, 96)
self.deviceTable.setColumnWidth(4, 112) self.deviceTable.setColumnWidth(4, 112)
self.deviceTable.viewport().installEventFilter(self)
header = self.deviceTable.horizontalHeader() header = self.deviceTable.horizontalHeader()
header.setSectionResizeMode(0, QHeaderView.Fixed) header.setSectionResizeMode(0, QHeaderView.Fixed)
header.setSectionResizeMode(1, QHeaderView.Interactive) header.setSectionResizeMode(1, QHeaderView.Interactive)
@@ -266,6 +283,19 @@ class SettingsPage(QWidget):
layout.setContentsMargins(0, 0, 0, 0) layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(scrollArea) layout.addWidget(scrollArea)
def eventFilter(self, watched, event):
if watched is self.deviceTable.viewport() and event.type() == QEvent.Resize:
self._update_device_placeholder_rows()
return super().eventFilter(watched, event)
def _update_device_placeholder_rows(self) -> None:
"""用不可交互空行填满 Android 设备表格的可视区域。"""
row_height = max(1, self.deviceTable.verticalHeader().defaultSectionSize())
viewport_height = max(row_height, self.deviceTable.viewport().height())
row_count = max(1, viewport_height // row_height)
self.deviceTableModel.set_placeholder_row_count(row_count)
def _build_current_device_card(self) -> CardWidget: def _build_current_device_card(self) -> CardWidget:
card = CardWidget(self) card = CardWidget(self)
card.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) card.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
@@ -323,6 +353,7 @@ class SettingsPage(QWidget):
"""显示后续 ADB 服务返回的设备列表。""" """显示后续 ADB 服务返回的设备列表。"""
self.deviceTableModel.set_devices(devices) self.deviceTableModel.set_devices(devices)
self._update_device_placeholder_rows()
def set_saved_android_device(self, serial: str) -> None: def set_saved_android_device(self, serial: str) -> None:
"""显示已经保存并实际用于自动化的 Android 设备。""" """显示已经保存并实际用于自动化的 Android 设备。"""