{"id":29127732,"url":"https://github.com/ultra-bugs/pyside6-datatable-widget","last_synced_at":"2025-06-30T01:01:56.868Z","repository":{"id":290319173,"uuid":"974025463","full_name":"ultra-bugs/pyside6-datatable-widget","owner":"ultra-bugs","description":"A PySide6 DataTable widget with jQuery DataTable-like functionality","archived":false,"fork":false,"pushed_at":"2025-06-27T04:27:38.000Z","size":104,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-27T04:56:18.406Z","etag":null,"topics":["data-visualization","desktop-app","desktop-application","gui","pyside6","qt","qt6","table"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/pyside6-datatable-widget/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ultra-bugs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-28T06:34:03.000Z","updated_at":"2025-06-27T04:42:17.000Z","dependencies_parsed_at":"2025-04-28T07:36:07.583Z","dependency_job_id":"8d9c265e-5346-4988-8c84-d7fe611ed700","html_url":"https://github.com/ultra-bugs/pyside6-datatable-widget","commit_stats":null,"previous_names":["ultra-bugs/pyside6-datatable-widget"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ultra-bugs/pyside6-datatable-widget","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ultra-bugs%2Fpyside6-datatable-widget","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ultra-bugs%2Fpyside6-datatable-widget/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ultra-bugs%2Fpyside6-datatable-widget/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ultra-bugs%2Fpyside6-datatable-widget/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ultra-bugs","download_url":"https://codeload.github.com/ultra-bugs/pyside6-datatable-widget/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ultra-bugs%2Fpyside6-datatable-widget/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262690387,"owners_count":23349167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-visualization","desktop-app","desktop-application","gui","pyside6","qt","qt6","table"],"created_at":"2025-06-30T01:01:42.323Z","updated_at":"2025-06-30T01:01:56.718Z","avatar_url":"https://github.com/ultra-bugs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PySide6 DataTable\n\nA powerful DataTable widget for PySide6 applications with functionality similar to jQuery DataTable.\n\n## Features\n\n- **Customizable Table**: Easily configure columns, types, and formatting\n- **Data Type Detection**: Automatically detect and handle different data types [NOT-IMPLEMENTED-YET]\n- **Type-based Sorting**: Different column types sort appropriately\n- **Search Functionality**: Global and column-specific search\n- **Row Collapsing**: Support for expandable/collapsible rows\n- **Pagination**: Built-in pagination with configurable page sizes [SEMI-IMPLEMENTED]\n- **Column Visibility**: Show/hide columns easily\n- **Aggregation Functions**: Calculate sums, averages, percentages, etc. [SEMI-IMPLEMENTED]\n- **Custom Formatting**: Format data display for different column types\n- **Observer Pattern**: Event-driven architecture for clear code organization\n\n## Installation\n\n```bash\npip install pyside6-datatable-widget\n```\n\n## Basic Usage\n\n```python\nimport sys\nfrom PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget\nfrom datatable import DataTable, DataType\n\nclass MainWindow(QMainWindow):\n    def __init__(self):\n        super().__init__()\n        self.setWindowTitle(\"DataTable Example\")\n        self.resize(800, 600)\n        \n        # Create central widget and layout\n        central_widget = QWidget()\n        self.setCentralWidget(central_widget)\n        layout = QVBoxLayout(central_widget)\n        \n        # Create DataTable\n        self.data_table = DataTable()\n        layout.addWidget(self.data_table)\n        \n        # Set up columns (key, header, data_type)\n        columns = [\n            (\"id\", \"ID\", DataType.NUMERIC),\n            (\"name\", \"Name\", DataType.STRING),\n            (\"age\", \"Age\", DataType.NUMERIC),\n            (\"active\", \"Active\", DataType.BOOLEAN)\n        ]\n        \n        # Set up data\n        data = [\n            {\"id\": 1, \"name\": \"John\", \"age\": 30, \"active\": True},\n            {\"id\": 2, \"name\": \"Jane\", \"age\": 25, \"active\": False},\n            {\"id\": 3, \"name\": \"Bob\", \"age\": 40, \"active\": True}\n        ]\n        \n        # Apply to table\n        self.data_table.setColumns(columns)\n        self.data_table.setData(data)\n        \n        # Connect signals\n        self.data_table.rowSelected.connect(self.on_row_selected)\n        \n    def on_row_selected(self, row, row_data):\n        print(f\"Row {row} selected: {row_data}\")\n\nif __name__ == \"__main__\":\n    app = QApplication(sys.argv)\n    window = MainWindow()\n    window.show()\n    sys.exit(app.exec())\n```\n\n## Advanced Features\n\n### Custom Column Formatting\n\n```python\nfrom datatable import DataTableModel\n\n# Create model with custom formatting\nmodel = DataTableModel()\nmodel.setFormattingFunction(\"price\", lambda value: f\"${value:.2f}\")\nmodel.setFormattingFunction(\"percentage\", lambda value: f\"{value:.1f}%\")\n\n# Set model to table\ndata_table.setModel(model)\n```\n\n### Row Collapsing\n\n```python\n# Enable row collapsing\ndata_table.enableRowCollapsing(True, \"subrows\")\n\n# Example data with subrows\ndata = [\n    {\n        \"id\": 1,\n        \"name\": \"Category A\",\n        \"total\": 1000,\n        \"subrows\": [\n            {\"id\": 101, \"name\": \"Item A1\", \"total\": 500},\n            {\"id\": 102, \"name\": \"Item A2\", \"total\": 500}\n        ]\n    },\n    {\n        \"id\": 2,\n        \"name\": \"Category B\",\n        \"total\": 2000,\n        \"subrows\": [\n            {\"id\": 201, \"name\": \"Item B1\", \"total\": 1200},\n            {\"id\": 202, \"name\": \"Item B2\", \"total\": 800}\n        ]\n    }\n]\n\ndata_table.setData(data)\n\n# Connect expansion signals\ndata_table.rowExpanded.connect(lambda row, data: print(f\"Row {row} expanded\"))\ndata_table.rowCollapsed.connect(lambda row, data: print(f\"Row {row} collapsed\"))\n```\n\n### Aggregation Functions\n\n```python\n# Get aggregate values\ntotal = data_table.getAggregateValue(\"amount\", \"sum\")\naverage = data_table.getAggregateValue(\"amount\", \"avg\")\ncount = data_table.getAggregateValue(\"id\", \"count\")\n\n# Calculate percentage of a row value relative to total\nrow_data = data_table.getSelectedRow()\nif row_data:\n    amount = row_data[\"amount\"]\n    total = data_table.getAggregateValue(\"amount\", \"sum\")\n    percentage = data_table.calculateRowPercentage(row_index, \"amount\")\n```\n\n### Custom Search Functions\n\n```python\n# Set custom search function for a column\nmodel.setSearchFunction(\"complex_data\", lambda value, term: term in str(value[\"name\"]))\n\n# Search in table\ndata_table.search(\"search term\")\n\n# Search specific column\nmatching_rows = model.searchColumn(\"name\", \"John\")\n```\n\n## API Reference\n\n### DataTable\n\nMain widget class that provides the UI and functionality.\n\n#### Methods\n\n- `setData(data)`: Set table data\n- `appendRow(row_data)`: Append a row to the table\n- `insertRow(row_index, row_data)`: Insert a row at a specific index\n- `setColumns(columns)`: Set table columns\n- `setVisibleColumns(columns)`: Set which columns are visible\n- `enableRowCollapsing(enabled, child_row_key)`: Enable/disable row collapsing\n- `search(term)`: Search the table\n- `sort(column_key, order)`: Sort the table\n- `setPage(page)`: Set current page\n- `setRowsPerPage(rows)`: Set rows per page\n- `getData()`: Get current table data\n- `getSelectedRow()`: Get selected row data\n- `getAggregateValue(column_key, agg_type)`: Get aggregate value for column\n\n#### Signals\n\n- `pageChanged(page)`: Emitted when page changes\n- `rowSelected(row, row_data)`: Emitted when row is selected\n- `rowExpanded(row, row_data)`: Emitted when row is expanded\n- `rowCollapsed(row, row_data)`: Emitted when row is collapsed\n- `dataFiltered(rows)`: Emitted when data is filtered\n- `sortChanged(column, order)`: Emitted when sort order changes\n\n### DataTableModel\n\nModel class that manages data and operations.\n\n#### Methods\n\n- `setData(data)`: Set model data\n- `setColumns(columns)`: Set model columns\n- `setFormattingFunction(column_key, func)`: Set formatting function\n- `setEditableColumns(editable_columns)`: Set which columns are editable\n- `setVisibleColumns(visible_columns)`: Set which columns are visible\n- `setSearchFunction(column_key, func)`: Set search function\n- `setSortFunction(column_key, func)`: Set sort function\n- `setAggregationFunction(column_key, agg_type, func)`: Set aggregation function\n- `enableRowCollapsing(enabled, child_row_key)`: Enable row collapsing\n- `search(term)`: Search all rows\n- `searchColumn(column_key, term)`: Search specific column\n- `aggregate(column_key, agg_type)`: Aggregate column values\n- `calculateRowPercentage(row_index, column_key)`: Calculate row percentage\n\n#### Signals\n\n- `rowExpandedCollapsed(int, bool)`  : row, is_expanded. Emitted when a row, sub-rows expanded or collapsed\n\u003e Note: The model is child class of `QAbstractTableModel`. So these signals below are inherited (from `QAbstractItemModel`).\n\n- `dataChanged(topLeft, bottomRight, roles)`: Emitted when data in the specified range has been modified.\n- `headerDataChanged(orientation, first, last)`: Emitted when header data for a section changes.\n- `layoutChanged()`: Emitted when layout of the model changes drastically.\n- `layoutAboutToBeChanged()`: Emitted before a major layout change.\n- `modelReset()`: Emitted after the model is reset.\n- `rowsAboutToBeInserted(parent, start, end)`: Emitted before rows are inserted.\n- `rowsInserted(parent, start, end)`: Emitted after rows are inserted.\n- `rowsAboutToBeRemoved(parent, start, end)`: Emitted before rows are removed.\n- `rowsRemoved(parent, start, end)`: Emitted after rows are removed.\n- `columnsAboutToBeInserted(parent, start, end)`: Emitted before columns are inserted.\n- `columnsInserted(parent, start, end)`: Emitted after columns are inserted.\n- `columnsAboutToBeRemoved(parent, start, end)`: Emitted before columns are removed.\n- `columnsRemoved(parent, start, end)`: Emitted after columns are removed.\n- `rowsMoved(parent, start, end, destination, row)`: Emitted after rows are moved.\n- `columnsMoved(parent, start, end, destination, column)`: Emitted after columns are moved.\n\n## License\n\nThis project is licensed under the GNU General Public License v3.0 (GPLv3).  \nSee the [LICENSE](./LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fultra-bugs%2Fpyside6-datatable-widget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fultra-bugs%2Fpyside6-datatable-widget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fultra-bugs%2Fpyside6-datatable-widget/lists"}