add filter
This commit is contained in:
@@ -1,9 +1,9 @@
|
|||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from zoneinfo import ZoneInfo
|
from zoneinfo import ZoneInfo
|
||||||
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QAbstractItemView
|
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QAbstractItemView
|
||||||
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt
|
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, QSortFilterProxyModel
|
||||||
from qfluentwidgets import (
|
from qfluentwidgets import (
|
||||||
PushButton, TableView, FluentIcon as Fi,
|
PushButton, TableView, FluentIcon as Fi, PillPushButton
|
||||||
)
|
)
|
||||||
|
|
||||||
from common.utils import SAFE_MAP_ICON, SAFE_MAP
|
from common.utils import SAFE_MAP_ICON, SAFE_MAP
|
||||||
@@ -79,6 +79,22 @@ class ExtensionsDataTable(QAbstractTableModel):
|
|||||||
return dt.strftime(custom_format)
|
return dt.strftime(custom_format)
|
||||||
|
|
||||||
|
|
||||||
|
class SafeFilterProxyModel(QSortFilterProxyModel):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
self.accepted_status = set()
|
||||||
|
|
||||||
|
def set_accepted_status(self, status: list[int]):
|
||||||
|
self.accepted_status = set(status)
|
||||||
|
self.invalidateFilter()
|
||||||
|
|
||||||
|
def filterAcceptsRow(self, source_row: int, source_parent, /):
|
||||||
|
index = self.sourceModel().index(source_row, 2, source_parent)
|
||||||
|
ext_d: dict[str, str | int] = self.sourceModel().data(index, Qt.ItemDataRole.UserRole)
|
||||||
|
return ext_d["SAFE"] in self.accepted_status
|
||||||
|
|
||||||
|
|
||||||
class MainInterface(QWidget):
|
class MainInterface(QWidget):
|
||||||
|
|
||||||
def __init__(self, ext_data: list[dict[str, str | int]] = None, parent=None):
|
def __init__(self, ext_data: list[dict[str, str | int]] = None, parent=None):
|
||||||
@@ -92,15 +108,33 @@ class MainInterface(QWidget):
|
|||||||
self.pbn_add = PushButton(Fi.ADD, "添加", self)
|
self.pbn_add = PushButton(Fi.ADD, "添加", self)
|
||||||
self.pbn_delete = PushButton(Fi.DELETE, "删除", self)
|
self.pbn_delete = PushButton(Fi.DELETE, "删除", self)
|
||||||
|
|
||||||
|
safe_checks = [
|
||||||
|
("安全", 1), ("未知", 0), ("不安全", -1), ("未记录", -2),
|
||||||
|
]
|
||||||
|
self.safe_switches: list[PillPushButton] = []
|
||||||
|
for text, m in safe_checks:
|
||||||
|
c = PillPushButton(self)
|
||||||
|
c.setText(text)
|
||||||
|
c.setIcon(SAFE_MAP_ICON[m])
|
||||||
|
c.setProperty("mark", m)
|
||||||
|
c.toggled.connect(self.update_filter)
|
||||||
|
self.safe_switches.append(c)
|
||||||
|
|
||||||
self.hly_top.addWidget(self.pbn_refresh)
|
self.hly_top.addWidget(self.pbn_refresh)
|
||||||
self.hly_top.addWidget(self.pbn_add)
|
self.hly_top.addWidget(self.pbn_add)
|
||||||
self.hly_top.addWidget(self.pbn_delete)
|
self.hly_top.addWidget(self.pbn_delete)
|
||||||
self.hly_top.addStretch(1)
|
self.hly_top.addStretch(1)
|
||||||
|
for c in self.safe_switches:
|
||||||
|
self.hly_top.addWidget(c)
|
||||||
self.vly_m.addLayout(self.hly_top)
|
self.vly_m.addLayout(self.hly_top)
|
||||||
|
|
||||||
self.tbv_m = TableView(self)
|
self.tbv_m = TableView(self)
|
||||||
self.ext_model = ExtensionsDataTable(ext_data, self)
|
self.ext_model = ExtensionsDataTable(ext_data, self)
|
||||||
self.tbv_m.setModel(self.ext_model)
|
self.fil_model = SafeFilterProxyModel(self)
|
||||||
|
self.fil_model.setSourceModel(self.ext_model)
|
||||||
|
|
||||||
|
self.tbv_m.setModel(self.fil_model)
|
||||||
|
self.tbv_m.setSortingEnabled(True)
|
||||||
self.tbv_m.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
|
self.tbv_m.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
|
||||||
self.tbv_m.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) # 整行选中
|
self.tbv_m.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) # 整行选中
|
||||||
self.tbv_m.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) # 只允许单选
|
self.tbv_m.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) # 只允许单选
|
||||||
@@ -113,4 +147,16 @@ class MainInterface(QWidget):
|
|||||||
self.tbv_m.setColumnWidth(1, 200)
|
self.tbv_m.setColumnWidth(1, 200)
|
||||||
self.tbv_m.setColumnWidth(3, 180)
|
self.tbv_m.setColumnWidth(3, 180)
|
||||||
|
|
||||||
self.vly_m.addWidget(self.tbv_m)
|
self.vly_m.addWidget(self.tbv_m)
|
||||||
|
|
||||||
|
# 放到最后
|
||||||
|
for c in self.safe_switches:
|
||||||
|
c.setChecked(True)
|
||||||
|
|
||||||
|
def update_filter(self, checked: bool):
|
||||||
|
accepted_status = []
|
||||||
|
for c in self.safe_switches:
|
||||||
|
if c.isChecked():
|
||||||
|
accepted_status.append(c.property("mark"))
|
||||||
|
|
||||||
|
self.fil_model.set_accepted_status(accepted_status)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from PySide6.QtWidgets import QApplication
|
from PySide6.QtWidgets import QApplication
|
||||||
from PySide6.QtCore import Qt, QThread, QModelIndex
|
from PySide6.QtCore import Qt, QThread, QModelIndex
|
||||||
from PySide6.QtGui import QIcon
|
from PySide6.QtGui import QIcon
|
||||||
from qfluentwidgets import MSFluentWindow, setTheme, Theme, InfoBar, FluentIcon as Fi
|
from qfluentwidgets import MSFluentWindow, setTheme, Theme, InfoBar, FluentIcon as Fi, InfoBarPosition
|
||||||
|
|
||||||
from common.utils import show_quick_tip, accept_warning
|
from common.utils import show_quick_tip, accept_warning
|
||||||
from common.api_worker import ApiWorker
|
from common.api_worker import ApiWorker
|
||||||
@@ -59,7 +59,8 @@ class MainWindow(MSFluentWindow):
|
|||||||
|
|
||||||
def handle_operation_finished(self, result: dict):
|
def handle_operation_finished(self, result: dict):
|
||||||
"""添加/更新/删除成功后的通用处理器"""
|
"""添加/更新/删除成功后的通用处理器"""
|
||||||
InfoBar.success("", "操作已成功完成。", duration=2000, parent=self.window())
|
InfoBar.success("", "操作已成功完成。", duration=2000,
|
||||||
|
position=InfoBarPosition.BOTTOM_RIGHT, parent=self.window())
|
||||||
self.worker.do_query_all() # 重新加载数据
|
self.worker.do_query_all() # 重新加载数据
|
||||||
|
|
||||||
def handle_error(self, error_message: str):
|
def handle_error(self, error_message: str):
|
||||||
|
|||||||
Reference in New Issue
Block a user