A powerful DataTable widget for PySide6 applications with functionality similar to jQuery DataTable.
- Customizable Table: Easily configure columns, types, and formatting
- Data Type Detection: Automatically detect and handle different data types
- Type-based Sorting: Different column types sort appropriately
- Search Functionality: Global and column-specific search
- Row Collapsing: Support for expandable/collapsible rows
- Pagination: Built-in pagination with configurable page sizes
- Column Visibility: Show/hide columns easily
- Aggregation Functions: Calculate sums, averages, percentages, etc.
- Custom Formatting: Format data display for different column types
- Observer Pattern: Event-driven architecture for clear code organization
pip install pyside6-datatable-widget
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from datatable import DataTable, DataType
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("DataTable Example")
self.resize(800, 600)
# Create central widget and layout
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout(central_widget)
# Create DataTable
self.data_table = DataTable()
layout.addWidget(self.data_table)
# Set up columns (key, header, data_type)
columns = [
("id", "ID", DataType.NUMERIC),
("name", "Name", DataType.STRING),
("age", "Age", DataType.NUMERIC),
("active", "Active", DataType.BOOLEAN)
]
# Set up data
data = [
{"id": 1, "name": "John", "age": 30, "active": True},
{"id": 2, "name": "Jane", "age": 25, "active": False},
{"id": 3, "name": "Bob", "age": 40, "active": True}
]
# Apply to table
self.data_table.setColumns(columns)
self.data_table.setData(data)
# Connect signals
self.data_table.rowSelected.connect(self.on_row_selected)
def on_row_selected(self, row, row_data):
print(f"Row {row} selected: {row_data}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
from datatable import DataTableModel
# Create model with custom formatting
model = DataTableModel()
model.setFormattingFunction("price", lambda value: f"${value:.2f}")
model.setFormattingFunction("percentage", lambda value: f"{value:.1f}%")
# Set model to table
data_table.setModel(model)
# Enable row collapsing
data_table.enableRowCollapsing(True, "subrows")
# Example data with subrows
data = [
{
"id": 1,
"name": "Category A",
"total": 1000,
"subrows": [
{"id": 101, "name": "Item A1", "total": 500},
{"id": 102, "name": "Item A2", "total": 500}
]
},
{
"id": 2,
"name": "Category B",
"total": 2000,
"subrows": [
{"id": 201, "name": "Item B1", "total": 1200},
{"id": 202, "name": "Item B2", "total": 800}
]
}
]
data_table.setData(data)
# Connect expansion signals
data_table.rowExpanded.connect(lambda row, data: print(f"Row {row} expanded"))
data_table.rowCollapsed.connect(lambda row, data: print(f"Row {row} collapsed"))
# Get aggregate values
total = data_table.getAggregateValue("amount", "sum")
average = data_table.getAggregateValue("amount", "avg")
count = data_table.getAggregateValue("id", "count")
# Calculate percentage of a row value relative to total
row_data = data_table.getSelectedRow()
if row_data:
amount = row_data["amount"]
total = data_table.getAggregateValue("amount", "sum")
percentage = data_table.calculateRowPercentage(row_index, "amount")
# Set custom search function for a column
model.setSearchFunction("complex_data", lambda value, term: term in str(value["name"]))
# Search in table
data_table.search("search term")
# Search specific column
matching_rows = model.searchColumn("name", "John")
Main widget class that provides the UI and functionality.
setData(data)
: Set table datasetColumns(columns)
: Set table columnssetVisibleColumns(columns)
: Set which columns are visibleenableRowCollapsing(enabled, child_row_key)
: Enable/disable row collapsingsearch(term)
: Search the tablesort(column_key, order)
: Sort the tablesetPage(page)
: Set current pagesetRowsPerPage(rows)
: Set rows per pagegetData()
: Get current table datagetSelectedRow()
: Get selected row datagetAggregateValue(column_key, agg_type)
: Get aggregate value for column
pageChanged(page)
: Emitted when page changesrowSelected(row, row_data)
: Emitted when row is selectedrowExpanded(row, row_data)
: Emitted when row is expandedrowCollapsed(row, row_data)
: Emitted when row is collapseddataFiltered(rows)
: Emitted when data is filteredsortChanged(column, order)
: Emitted when sort order changes
Model class that manages data and operations.
setData(data)
: Set model datasetColumns(columns)
: Set model columnssetFormattingFunction(column_key, func)
: Set formatting functionsetEditableColumns(editable_columns)
: Set which columns are editablesetVisibleColumns(visible_columns)
: Set which columns are visiblesetSearchFunction(column_key, func)
: Set search functionsetSortFunction(column_key, func)
: Set sort functionsetAggregationFunction(column_key, agg_type, func)
: Set aggregation functionenableRowCollapsing(enabled, child_row_key)
: Enable row collapsingsearch(term)
: Search all rowssearchColumn(column_key, term)
: Search specific columnaggregate(column_key, agg_type)
: Aggregate column valuescalculateRowPercentage(row_index, column_key)
: Calculate row percentage
This project is licensed under the GNU General Public License v3.0 (GPLv3).
See the LICENSE file for details.