A PySide6 DataTable widget with jQuery DataTable-like functionality
Project description
PySide6 DataTable
A powerful DataTable widget for PySide6 applications with functionality similar to jQuery DataTable.
Features
- Customizable Table: Easily configure columns, types, and formatting
- Data Type Detection: Automatically detect and handle different data types [NOT-IMPLEMENTED-YET]
- 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 [SEMI-IMPLEMENTED]
- Column Visibility: Show/hide columns easily
- Aggregation Functions: Calculate sums, averages, percentages, etc. [SEMI-IMPLEMENTED]
- Custom Formatting: Format data display for different column types
- Observer Pattern: Event-driven architecture for clear code organization
Installation
pip install pyside6-datatable-widget
Basic Usage
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())
Advanced Features
Custom Column Formatting
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)
Row Collapsing
# 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"))
Aggregation Functions
# 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")
Custom Search Functions
# 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")
API Reference
DataTable
Main widget class that provides the UI and functionality.
Methods
setData(data): Set table dataappendRow(row_data): Append a row to the tableinsertRow(row_index, row_data): Insert a row at a specific indexsetColumns(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
Signals
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
DataTableModel
Model class that manages data and operations.
Methods
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
Signals
rowExpandedCollapsed(int, bool): row, is_expanded. Emitted when a row, sub-rows expanded or collapsed
Note: The model is child class of
QAbstractTableModel. So these signals below are inherited (fromQAbstractItemModel).
dataChanged(topLeft, bottomRight, roles): Emitted when data in the specified range has been modified.headerDataChanged(orientation, first, last): Emitted when header data for a section changes.layoutChanged(): Emitted when layout of the model changes drastically.layoutAboutToBeChanged(): Emitted before a major layout change.modelReset(): Emitted after the model is reset.rowsAboutToBeInserted(parent, start, end): Emitted before rows are inserted.rowsInserted(parent, start, end): Emitted after rows are inserted.rowsAboutToBeRemoved(parent, start, end): Emitted before rows are removed.rowsRemoved(parent, start, end): Emitted after rows are removed.columnsAboutToBeInserted(parent, start, end): Emitted before columns are inserted.columnsInserted(parent, start, end): Emitted after columns are inserted.columnsAboutToBeRemoved(parent, start, end): Emitted before columns are removed.columnsRemoved(parent, start, end): Emitted after columns are removed.rowsMoved(parent, start, end, destination, row): Emitted after rows are moved.columnsMoved(parent, start, end, destination, column): Emitted after columns are moved.
License
This project is licensed under the GNU General Public License v3.0 (GPLv3).
See the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyside6_datatable_widget-1.1.0.6.tar.gz.
File metadata
- Download URL: pyside6_datatable_widget-1.1.0.6.tar.gz
- Upload date:
- Size: 42.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80a634b90ba38045b0550e51824899928651c2a3f5b2f32753b03dee673955a5
|
|
| MD5 |
e7c22143551d002f01bc9972b9c67cac
|
|
| BLAKE2b-256 |
8c21f5184a4d74531008db8bda570536da22b8bc3b4bd1a20a56f77cbc9291cf
|
Provenance
The following attestation bundles were made for pyside6_datatable_widget-1.1.0.6.tar.gz:
Publisher:
python-publish.yml on ultra-bugs/pyside6-datatable-widget
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyside6_datatable_widget-1.1.0.6.tar.gz -
Subject digest:
80a634b90ba38045b0550e51824899928651c2a3f5b2f32753b03dee673955a5 - Sigstore transparency entry: 539535937
- Sigstore integration time:
-
Permalink:
ultra-bugs/pyside6-datatable-widget@de697657a39a2eaaa983e5882c7a8f781fb97967 -
Branch / Tag:
refs/tags/1.1.0.6 - Owner: https://github.com/ultra-bugs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@de697657a39a2eaaa983e5882c7a8f781fb97967 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pyside6_datatable_widget-1.1.0.6-py3-none-any.whl.
File metadata
- Download URL: pyside6_datatable_widget-1.1.0.6-py3-none-any.whl
- Upload date:
- Size: 44.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e32bfaaf682d81291856a45938c5ac2911ba89f52e52bd483b7a5d33b7d723c2
|
|
| MD5 |
700d1a52035fd89654c728e54293c79f
|
|
| BLAKE2b-256 |
0089248017d97fdcdb764eff291f1a54079bd6dc90610672a768a3e1fe39c413
|
Provenance
The following attestation bundles were made for pyside6_datatable_widget-1.1.0.6-py3-none-any.whl:
Publisher:
python-publish.yml on ultra-bugs/pyside6-datatable-widget
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyside6_datatable_widget-1.1.0.6-py3-none-any.whl -
Subject digest:
e32bfaaf682d81291856a45938c5ac2911ba89f52e52bd483b7a5d33b7d723c2 - Sigstore transparency entry: 539535962
- Sigstore integration time:
-
Permalink:
ultra-bugs/pyside6-datatable-widget@de697657a39a2eaaa983e5882c7a8f781fb97967 -
Branch / Tag:
refs/tags/1.1.0.6 - Owner: https://github.com/ultra-bugs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@de697657a39a2eaaa983e5882c7a8f781fb97967 -
Trigger Event:
release
-
Statement type: