AbstractTableBrowser ABC
Generic searchable table widget pattern for consistent browser UIs.
Module: pyqt_reactive.widgets.shared.abstract_table_browser
Overview
AbstractTableBrowser is an abstract base class for table-based browser widgets.
It provides common infrastructure for displaying searchable, filterable table views
of item collections. Subclasses implement abstract methods to customize column layout,
row population, and event handling.
Each subclass requires <100 lines of code to implement a fully-functional browser.
Core Components
AbstractTableBrowser[T]
├── search_input: QLineEdit # Search box
├── table_widget: QTableWidget # Main table
├── status_label: QLabel # "Showing N/M items"
├── _search_service: SearchService # Filter logic
└── Signals:
├── item_selected(key, item)
├── item_double_clicked(key, item)
└── items_selected(keys) # Multi-select mode
ColumnDef Configuration
Columns are declaratively defined using ColumnDef:
@dataclass
class ColumnDef:
name: str # Header text
key: str # Internal key
width: Optional[int] = None # Fixed width (None = stretch)
sortable: bool = True # Enable column sorting
resizable: bool = True # Enable resize handle
Abstract Methods
Subclasses must implement three methods:
class MyBrowser(AbstractTableBrowser[MyItemType]):
def get_columns(self) -> List[ColumnDef]:
"""Return column definitions for the table."""
return [
ColumnDef("Name", "name", width=200),
ColumnDef("Status", "status", width=100),
]
def extract_row_data(self, item: MyItemType) -> List[str]:
"""Extract display values for a table row."""
return [item.name, item.status]
def get_searchable_text(self, item: MyItemType) -> str:
"""Return searchable text for an item."""
return f"{item.name} {item.status}"
Implementations
Browser |
Columns |
Used By |
|---|---|---|
|
Name, Module, Backend, Contract, Tags |
FunctionSelectorDialog |
|
Filename + dynamic metadata keys |
ImageBrowserWidget |
|
Index, Time, Label, States |
SnapshotBrowserWindow |
Dynamic Columns
ImageTableBrowser demonstrates dynamic column configuration:
browser = ImageTableBrowser()
browser.set_metadata_keys(['well', 'channel', 'z_slice']) # Add columns
browser.set_items(file_metadata_dict)
The set_metadata_keys() method calls reconfigure_columns() to rebuild
the table header before populating items.
Selection Modes
Two modes are supported:
single (default): One item at a time, emits
item_selectedmulti: Multiple items, emits
items_selectedwith list of keys
# Multi-select for batch operations
browser = ImageTableBrowser(selection_mode='multi')
browser.items_selected.connect(self._on_files_selected)
SearchService Integration
The SearchService (from pyqt_reactive.services.search_service) provides
framework-agnostic search with:
Minimum character threshold (default: 2)
Case-insensitive substring matching
Performance optimization for short queries
See Also
List Item Preview System - List widget styling patterns
Widget Protocol System - ABC contracts for widgets