diff options
Diffstat (limited to 'examples/widgets/itemviews')
18 files changed, 133 insertions, 59 deletions
diff --git a/examples/widgets/itemviews/address_book/adddialogwidget.py b/examples/widgets/itemviews/address_book/adddialogwidget.py index 276a8d2b4..ecb853e80 100644 --- a/examples/widgets/itemviews/address_book/adddialogwidget.py +++ b/examples/widgets/itemviews/address_book/adddialogwidget.py @@ -15,8 +15,8 @@ class AddDialogWidget(QDialog): name_label = QLabel("Name") address_label = QLabel("Address") - button_box = QDialogButtonBox(QDialogButtonBox.Ok | - QDialogButtonBox.Cancel) + button_box = QDialogButtonBox(QDialogButtonBox.Ok + | QDialogButtonBox.Cancel) self._name_text = QLineEdit() self._address_text = QTextEdit() diff --git a/examples/widgets/itemviews/address_book/address_book.py b/examples/widgets/itemviews/address_book/address_book.py index 2121f2783..af0cf3dee 100644 --- a/examples/widgets/itemviews/address_book/address_book.py +++ b/examples/widgets/itemviews/address_book/address_book.py @@ -2,6 +2,7 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +from PySide6.QtCore import Slot from PySide6.QtGui import QAction from PySide6.QtWidgets import (QMainWindow, QFileDialog, QApplication) @@ -24,16 +25,19 @@ class MainWindow(QMainWindow): tool_menu = self.menuBar().addMenu("&Tools") # Populate the File menu - open_action = self.create_action("&Open...", file_menu, self.open_file) - save_action = self.create_action("&Save As...", file_menu, self.save_file) + self.open_action = self.create_action("&Open...", file_menu, self.open_file) + self.save_action = self.create_action("&Save As...", file_menu, self.save_file) file_menu.addSeparator() - exit_action = self.create_action("E&xit", file_menu, self.close) + self.exit_action = self.create_action("E&xit", file_menu, self.close) # Populate the Tools menu - add_action = self.create_action("&Add Entry...", tool_menu, self._address_widget.add_entry) - self._edit_action = self.create_action("&Edit Entry...", tool_menu, self._address_widget.edit_entry) + self.add_action = self.create_action( + "&Add Entry...", tool_menu, self._address_widget.add_entry) + self._edit_action = self.create_action( + "&Edit Entry...", tool_menu, self._address_widget.edit_entry) tool_menu.addSeparator() - self._remove_action = self.create_action("&Remove Entry", tool_menu, self._address_widget.remove_entry) + self._remove_action = self.create_action( + "&Remove Entry", tool_menu, self._address_widget.remove_entry) # Disable the edit and remove menu items initially, as there are # no items yet. @@ -60,11 +64,13 @@ class MainWindow(QMainWindow): # # In PySide6, these functions return a tuple: (filename, filter) + @Slot() def open_file(self): filename, _ = QFileDialog.getOpenFileName(self) if filename: self._address_widget.read_from_file(filename) + @Slot() def save_file(self): filename, _ = QFileDialog.getSaveFileName(self) if filename: diff --git a/examples/widgets/itemviews/address_book/addresswidget.py b/examples/widgets/itemviews/address_book/addresswidget.py index 7987ae3cd..cb2f46ea1 100644 --- a/examples/widgets/itemviews/address_book/addresswidget.py +++ b/examples/widgets/itemviews/address_book/addresswidget.py @@ -7,7 +7,7 @@ try: except ImportError: import pickle -from PySide6.QtCore import (Qt, Signal, QRegularExpression, QModelIndex, +from PySide6.QtCore import (Qt, Signal, Slot, QRegularExpression, QModelIndex, QItemSelection, QSortFilterProxyModel) from PySide6.QtWidgets import QTabWidget, QMessageBox, QTableView, QAbstractItemView @@ -35,6 +35,7 @@ class AddressWidget(QTabWidget): self.setup_tabs() + @Slot() def add_entry(self, name=None, address=None): """ Add an entry to the addressbook. """ if name is None and address is None: @@ -83,6 +84,7 @@ class AddressWidget(QTabWidget): table_view = self.currentWidget() table_view.resizeRowToContents(ix.row()) + @Slot() def edit_entry(self): """ Edit an entry in the addressbook. """ table_view = self.currentWidget() @@ -115,6 +117,7 @@ class AddressWidget(QTabWidget): ix = self._table_model.index(row, 1, QModelIndex()) self._table_model.setData(ix, new_address, Qt.EditRole) + @Slot() def remove_entry(self): """ Remove an entry from the addressbook. """ table_view = self.currentWidget() @@ -163,8 +166,9 @@ class AddressWidget(QTabWidget): proxy_model.setFilterKeyColumn(0) # Filter on the "name" column proxy_model.sort(0, Qt.AscendingOrder) - # This prevents an application crash (see: https://www.qtcentre.org/threads/58874-QListView-SelectionModel-selectionChanged-Crash) - viewselectionmodel = table_view.selectionModel() + # This prevents an application crash (see: + # https://www.qtcentre.org/threads/58874-QListView-SelectionModel-selectionChanged-Crash) # noqa: E501 + self.viewselectionmodel = table_view.selectionModel() table_view.selectionModel().selectionChanged.connect(self.selection_changed) self.addTab(table_view, group) diff --git a/examples/widgets/itemviews/address_book/tablemodel.py b/examples/widgets/itemviews/address_book/tablemodel.py index a0d63bbe2..3c1dbd4cc 100644 --- a/examples/widgets/itemviews/address_book/tablemodel.py +++ b/examples/widgets/itemviews/address_book/tablemodel.py @@ -105,5 +105,5 @@ class TableModel(QAbstractTableModel): """ if not index.isValid(): return Qt.ItemIsEnabled - return Qt.ItemFlags(QAbstractTableModel.flags(self, index) | - Qt.ItemIsEditable) + return Qt.ItemFlags(QAbstractTableModel.flags(self, index) + | Qt.ItemIsEditable) diff --git a/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py b/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py index a61a76cb8..a30b0abdf 100644 --- a/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py +++ b/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py @@ -4,7 +4,7 @@ import sys from PySide6.QtCore import (QDate, QDateTime, QRegularExpression, - QSortFilterProxyModel, QTime, Qt) + QSortFilterProxyModel, QTime, Qt, Slot) from PySide6.QtGui import QStandardItemModel from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit, @@ -46,11 +46,11 @@ class Window(QWidget): self._filter_syntax_combo_box = QComboBox() self._filter_syntax_combo_box.addItem("Regular expression", - REGULAR_EXPRESSION) + REGULAR_EXPRESSION) self._filter_syntax_combo_box.addItem("Wildcard", - WILDCARD) + WILDCARD) self._filter_syntax_combo_box.addItem("Fixed string", - FIXED_STRING) + FIXED_STRING) self._filter_syntax_label = QLabel("Filter &syntax:") self._filter_syntax_label.setBuddy(self._filter_syntax_combo_box) @@ -102,6 +102,7 @@ class Window(QWidget): self._proxy_model.setSourceModel(model) self._source_view.setModel(model) + @Slot() def filter_reg_exp_changed(self): syntax_nr = self._filter_syntax_combo_box.currentData() pattern = self._filter_pattern_line_edit.text() @@ -117,9 +118,11 @@ class Window(QWidget): reg_exp.setPatternOptions(options) self._proxy_model.setFilterRegularExpression(reg_exp) + @Slot() def filter_column_changed(self): self._proxy_model.setFilterKeyColumn(self._filter_column_combo_box.currentIndex()) + @Slot() def sort_changed(self): if self._sort_case_sensitivity_check_box.isChecked(): case_sensitivity = Qt.CaseSensitive @@ -144,25 +147,25 @@ def create_mail_model(parent): model.setHeaderData(2, Qt.Horizontal, "Date") add_mail(model, "Happy New Year!", "Grace K. <grace@software-inc.com>", - QDateTime(QDate(2006, 12, 31), QTime(17, 3))) + QDateTime(QDate(2006, 12, 31), QTime(17, 3))) add_mail(model, "Radically new concept", "Grace K. <grace@software-inc.com>", - QDateTime(QDate(2006, 12, 22), QTime(9, 44))) + QDateTime(QDate(2006, 12, 22), QTime(9, 44))) add_mail(model, "Accounts", "pascale@nospam.com", - QDateTime(QDate(2006, 12, 31), QTime(12, 50))) + QDateTime(QDate(2006, 12, 31), QTime(12, 50))) add_mail(model, "Expenses", "Joe Bloggs <joe@bloggs.com>", - QDateTime(QDate(2006, 12, 25), QTime(11, 39))) + QDateTime(QDate(2006, 12, 25), QTime(11, 39))) add_mail(model, "Re: Expenses", "Andy <andy@nospam.com>", - QDateTime(QDate(2007, 1, 2), QTime(16, 5))) + QDateTime(QDate(2007, 1, 2), QTime(16, 5))) add_mail(model, "Re: Accounts", "Joe Bloggs <joe@bloggs.com>", - QDateTime(QDate(2007, 1, 3), QTime(14, 18))) + QDateTime(QDate(2007, 1, 3), QTime(14, 18))) add_mail(model, "Re: Accounts", "Andy <andy@nospam.com>", - QDateTime(QDate(2007, 1, 3), QTime(14, 26))) + QDateTime(QDate(2007, 1, 3), QTime(14, 26))) add_mail(model, "Sports", "Linda Smith <linda.smith@nospam.com>", - QDateTime(QDate(2007, 1, 5), QTime(11, 33))) + QDateTime(QDate(2007, 1, 5), QTime(11, 33))) add_mail(model, "AW: Sports", "Rolf Newschweinstein <rolfn@nospam.com>", - QDateTime(QDate(2007, 1, 5), QTime(12, 0))) + QDateTime(QDate(2007, 1, 5), QTime(12, 0))) add_mail(model, "RE: Sports", "Petra Schmidt <petras@nospam.com>", - QDateTime(QDate(2007, 1, 5), QTime(12, 1))) + QDateTime(QDate(2007, 1, 5), QTime(12, 1))) return model diff --git a/examples/widgets/itemviews/dirview/dirview.py b/examples/widgets/itemviews/dirview/dirview.py new file mode 100644 index 000000000..d1be6958e --- /dev/null +++ b/examples/widgets/itemviews/dirview/dirview.py @@ -0,0 +1,59 @@ +# Copyright (C) 2020 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import sys +from argparse import ArgumentParser, RawTextHelpFormatter + +from PySide6.QtWidgets import (QApplication, QFileSystemModel, + QFileIconProvider, QScroller, QTreeView) +from PySide6.QtCore import QDir + +"""PySide6 port of the widgets/itemviews/dirview example from Qt v6.x""" + + +if __name__ == "__main__": + app = QApplication(sys.argv) + + name = "Dir View" + argument_parser = ArgumentParser(description=name, + formatter_class=RawTextHelpFormatter) + argument_parser.add_argument("--no-custom", "-c", action="store_true", + help="Set QFileSystemModel.DontUseCustomDirectoryIcons") + argument_parser.add_argument("--no-watch", "-w", action="store_true", + help="Set QFileSystemModel.DontWatch") + argument_parser.add_argument("directory", + help="The directory to start in.", + nargs='?', type=str) + options = argument_parser.parse_args() + root_path = options.directory + + model = QFileSystemModel() + icon_provider = QFileIconProvider() + model.setIconProvider(icon_provider) + model.setRootPath("") + if options.no_custom: + model.setOption(QFileSystemModel.DontUseCustomDirectoryIcons) + if options.no_watch: + model.setOption(QFileSystemModel.DontWatchForChanges) + tree = QTreeView() + tree.setModel(model) + if root_path: + root_index = model.index(QDir.cleanPath(root_path)) + if root_index.isValid(): + tree.setRootIndex(root_index) + + # Demonstrating look and feel features + tree.setAnimated(False) + tree.setIndentation(20) + tree.setSortingEnabled(True) + availableSize = tree.screen().availableGeometry().size() + tree.resize(availableSize / 2) + tree.setColumnWidth(0, tree.width() / 3) + + # Make it flickable on touchscreens + QScroller.grabGesture(tree, QScroller.ScrollerGestureType.TouchGesture) + + tree.setWindowTitle(name) + tree.show() + + sys.exit(app.exec()) diff --git a/examples/widgets/itemviews/dirview/dirview.pyproject b/examples/widgets/itemviews/dirview/dirview.pyproject new file mode 100644 index 000000000..9470083c9 --- /dev/null +++ b/examples/widgets/itemviews/dirview/dirview.pyproject @@ -0,0 +1,3 @@ +{ + "files": ["dirview.py"] +} diff --git a/examples/widgets/itemviews/dirview/doc/dirview.rst b/examples/widgets/itemviews/dirview/doc/dirview.rst new file mode 100644 index 000000000..7044fdf58 --- /dev/null +++ b/examples/widgets/itemviews/dirview/doc/dirview.rst @@ -0,0 +1,5 @@ +Dir View Example +================ + +The Dir View example shows a tree view of the local file system. It uses the +QFileSystemModel class to provide file and directory information. diff --git a/examples/widgets/itemviews/editabletreemodel/mainwindow.py b/examples/widgets/itemviews/editabletreemodel/mainwindow.py index c6abfa568..1489bf28b 100644 --- a/examples/widgets/itemviews/editabletreemodel/mainwindow.py +++ b/examples/widgets/itemviews/editabletreemodel/mainwindow.py @@ -52,7 +52,7 @@ class MainWindow(QMainWindow): self.insert_child_action.setShortcut("Ctrl+N") self.insert_child_action.triggered.connect(self.insert_child) help_menu = menubar.addMenu("&Help") - about_qt_action = help_menu.addAction("About Qt", qApp.aboutQt) + about_qt_action = help_menu.addAction("About Qt", qApp.aboutQt) # noqa: F821 about_qt_action.setShortcut("F1") self.setWindowTitle("Editable Tree Model") diff --git a/examples/widgets/itemviews/editabletreemodel/treemodel.py b/examples/widgets/itemviews/editabletreemodel/treemodel.py index 58e405c12..a58572fca 100644 --- a/examples/widgets/itemviews/editabletreemodel/treemodel.py +++ b/examples/widgets/itemviews/editabletreemodel/treemodel.py @@ -2,14 +2,11 @@ # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -from PySide6.QtCore import QModelIndex, Qt, QAbstractItemModel, Signal +from PySide6.QtCore import QModelIndex, Qt, QAbstractItemModel from treeitem import TreeItem class TreeModel(QAbstractItemModel): - # Define signals - dataChanged = Signal(QModelIndex, QModelIndex, object) - headerDataChanged = Signal(Qt.Orientation, int, int) def __init__(self, headers: list, data: str, parent=None): super().__init__(parent) @@ -154,9 +151,7 @@ class TreeModel(QAbstractItemModel): result: bool = self.root_item.set_data(section, value) if result: - # todo: Check if emit headerDataChanged signal is correct - # emit headerDataChanged(orientation, section, section) - self.headerDataChanged(orientation, section, section) + self.headerDataChanged.emit(orientation, section, section) return result diff --git a/examples/widgets/itemviews/fetchmore/fetchmore.py b/examples/widgets/itemviews/fetchmore/fetchmore.py index 08617edad..5150250e0 100644 --- a/examples/widgets/itemviews/fetchmore/fetchmore.py +++ b/examples/widgets/itemviews/fetchmore/fetchmore.py @@ -11,9 +11,8 @@ down the list to see the model being populated on demand. import sys -from PySide6.QtCore import (QAbstractListModel, QDir, QFileInfo, QLibraryInfo, +from PySide6.QtCore import (QAbstractListModel, QDir, QModelIndex, Qt, Signal, Slot) -from PySide6.QtGui import QPalette from PySide6.QtWidgets import (QApplication, QFileIconProvider, QListView, QPlainTextEdit, QSizePolicy, QVBoxLayout, QWidget) @@ -50,7 +49,7 @@ class FileListModel(QAbstractListModel): if role == Qt.BackgroundRole: batch = row // BATCH_SIZE - palette = qApp.palette() + palette = qApp.palette() # noqa: F821 return palette.base() if batch % 2 == 0 else palette.alternateBase() if role == Qt.DecorationRole: @@ -113,7 +112,7 @@ class Window(QWidget): self.setWindowTitle("Fetch More Example") - @Slot(str, int, int) + @Slot(str, int, int, int) def update_log(self, path, start, number, total): native_path = QDir.toNativeSeparators(path) last = start + number - 1 diff --git a/examples/widgets/itemviews/jsonmodel/jsonmodel.py b/examples/widgets/itemviews/jsonmodel/jsonmodel.py index c0adfc664..6e614c77f 100644 --- a/examples/widgets/itemviews/jsonmodel/jsonmodel.py +++ b/examples/widgets/itemviews/jsonmodel/jsonmodel.py @@ -3,7 +3,7 @@ import json import sys -from typing import Any, Iterable, List, Dict, Union +from typing import Any, List, Dict, Union from PySide6.QtWidgets import QTreeView, QApplication, QHeaderView from PySide6.QtCore import QAbstractItemModel, QModelIndex, QObject, Qt, QFileInfo @@ -182,10 +182,7 @@ class JsonModel(QAbstractItemModel): item = index.internalPointer() item.value = str(value) - if __binding__ in ("PySide", "PyQt4"): - self.dataChanged.emit(index, index) - else: - self.dataChanged.emit(index, index, [Qt.EditRole]) + self.dataChanged.emit(index, index, [Qt.EditRole]) return True diff --git a/examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst b/examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst index 954480067..12e505207 100644 --- a/examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst +++ b/examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst @@ -1,2 +1,5 @@ +SpinBox Delegate Example +========================= + A simple example that shows how a view can use a custom delegate to edit data obtained from a model. diff --git a/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py b/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py index 266b8c1e1..577f0faa5 100644 --- a/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py +++ b/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py @@ -10,6 +10,7 @@ from PySide6.QtCore import QModelIndex """PySide6 port of the widgets/itemviews/spinboxdelegate from Qt v6.x""" + #! [0] class SpinBoxDelegate(QStyledItemDelegate): """A delegate that allows the user to change integer values from the model @@ -52,7 +53,7 @@ class SpinBoxDelegate(QStyledItemDelegate): if __name__ == '__main__': app = QApplication(sys.argv) - model= QStandardItemModel(4, 2) + model = QStandardItemModel(4, 2) tableView = QTableView() tableView.setModel(model) diff --git a/examples/widgets/itemviews/spreadsheet/spreadsheet.py b/examples/widgets/itemviews/spreadsheet/spreadsheet.py index 2f5fbb64f..82ebe5ebb 100644 --- a/examples/widgets/itemviews/spreadsheet/spreadsheet.py +++ b/examples/widgets/itemviews/spreadsheet/spreadsheet.py @@ -134,7 +134,7 @@ class SpreadSheet(QMainWindow): about_menu = self.menuBar().addMenu("&Help") about_menu.addAction(self._about_spreadsheet) - @Slot() + @Slot(QTableWidgetItem) def update_status(self, item: QTableWidgetItem) -> None: if item and item == self._table.currentItem(): self.statusBar().showMessage(str(item.data(Qt.StatusTipRole)), 1000) @@ -144,7 +144,7 @@ class SpreadSheet(QMainWindow): ) ) - @Slot() + @Slot(QTableWidgetItem) def update_color(self, item: QTableWidgetItem) -> None: pix = QPixmap(16, 16) col = QColor() @@ -169,7 +169,7 @@ class SpreadSheet(QMainWindow): self._color_action.setIcon(pix) - @Slot() + @Slot(QTableWidgetItem) def update_line_edit(self, item: QTableWidgetItem) -> None: if item != self._table.currentItem(): return diff --git a/examples/widgets/itemviews/stardelegate/stardelegate.py b/examples/widgets/itemviews/stardelegate/stardelegate.py index 87bf1ff48..973eb14f6 100644 --- a/examples/widgets/itemviews/stardelegate/stardelegate.py +++ b/examples/widgets/itemviews/stardelegate/stardelegate.py @@ -111,15 +111,15 @@ if __name__ == "__main__": # Create and populate the tableWidget table_widget = QTableWidget(4, 4) table_widget.setItemDelegate(StarDelegate()) - table_widget.setEditTriggers(QAbstractItemView.DoubleClicked | - QAbstractItemView.SelectedClicked) + table_widget.setEditTriggers(QAbstractItemView.DoubleClicked + | QAbstractItemView.SelectedClicked) table_widget.setSelectionBehavior(QAbstractItemView.SelectRows) table_widget.setHorizontalHeaderLabels(["Title", "Genre", "Artist", "Rating"]) - data = [ ["Mass in B-Minor", "Baroque", "J.S. Bach", 5], - ["Three More Foxes", "Jazz", "Maynard Ferguson", 4], - ["Sex Bomb", "Pop", "Tom Jones", 3], - ["Barbie Girl", "Pop", "Aqua", 5] ] + data = [["Mass in B-Minor", "Baroque", "J.S. Bach", 5], + ["Three More Foxes", "Jazz", "Maynard Ferguson", 4], + ["Sex Bomb", "Pop", "Tom Jones", 3], + ["Barbie Girl", "Pop", "Aqua", 5]] for r in range(len(data)): table_widget.setItem(r, 0, QTableWidgetItem(data[r][0])) diff --git a/examples/widgets/itemviews/stardelegate/stareditor.py b/examples/widgets/itemviews/stardelegate/stareditor.py index 1b44164a8..296afa950 100644 --- a/examples/widgets/itemviews/stardelegate/stareditor.py +++ b/examples/widgets/itemviews/stardelegate/stareditor.py @@ -55,8 +55,7 @@ class StarEditor(QWidget): """ Calculate which star the user's mouse cursor is currently hovering over. """ - star = (x / (self.star_rating.sizeHint().width() / - self.star_rating.MAX_STAR_COUNT)) + 1 + star = (x / (self.star_rating.sizeHint().width() / self.star_rating.MAX_STAR_COUNT)) + 1 if (star <= 0) or (star > self.star_rating.MAX_STAR_COUNT): return -1 diff --git a/examples/widgets/itemviews/stardelegate/starrating.py b/examples/widgets/itemviews/stardelegate/starrating.py index 4d49f7405..28dbacd6f 100644 --- a/examples/widgets/itemviews/stardelegate/starrating.py +++ b/examples/widgets/itemviews/stardelegate/starrating.py @@ -23,13 +23,13 @@ class StarRating(object): self._star_polygon.append(QPointF(1.0, 0.5)) for i in range(1, 5): self._star_polygon.append(QPointF(0.5 + 0.5 * cos(0.8 * i * pi), - 0.5 + 0.5 * sin(0.8 * i * pi))) + 0.5 + 0.5 * sin(0.8 * i * pi))) # Create the diamond shape we'll show in the editor self._diamond_polygon = QPolygonF() diamond_points = [QPointF(0.4, 0.5), QPointF(0.5, 0.4), - QPointF(0.6, 0.5), QPointF(0.5, 0.6), - QPointF(0.4, 0.5)] + QPointF(0.6, 0.5), QPointF(0.5, 0.6), + QPointF(0.4, 0.5)] self._diamond_polygon.append(diamond_points) def sizeHint(self): |