From 921337f98c54d3c4a252569acd2152a1dea8c4bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 26 Jun 2023 15:02:51 +0200 Subject: [PATCH] Move pixelator example to manual test Pick-to: 6.5 6.6 Change-Id: I3ce2bc269a9f77bce3dd41f0127d01091c1408f6 Reviewed-by: Volker Hilsheimer --- examples/widgets/doc/src/pixelator.qdoc | 231 ------------------ examples/widgets/itemviews/CMakeLists.txt | 1 - examples/widgets/itemviews/itemviews.pro | 1 - src/widgets/dialogs/qprogressdialog.cpp | 2 +- .../doc/src/model-view-programming.qdoc | 4 - .../itemviews/qabstractitemdelegate.cpp | 2 +- src/widgets/itemviews/qitemdelegate.cpp | 6 +- src/widgets/itemviews/qtableview.cpp | 2 +- .../itemviews/pixelator/CMakeLists.txt | 0 .../itemviews/pixelator/imagemodel.cpp | 0 .../widgets/itemviews/pixelator/imagemodel.h | 0 .../widgets/itemviews/pixelator/images.qrc | 0 .../widgets/itemviews/pixelator/images/qt.png | Bin .../widgets/itemviews/pixelator/main.cpp | 0 .../itemviews/pixelator/mainwindow.cpp | 0 .../widgets/itemviews/pixelator/mainwindow.h | 0 .../widgets/itemviews/pixelator/pixelator.pro | 0 .../itemviews/pixelator/pixeldelegate.cpp | 0 .../itemviews/pixelator/pixeldelegate.h | 0 19 files changed, 7 insertions(+), 242 deletions(-) delete mode 100644 examples/widgets/doc/src/pixelator.qdoc rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/imagemodel.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/imagemodel.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/images.qrc (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/images/qt.png (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/pixelator.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/pixeldelegate.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/pixeldelegate.h (100%) diff --git a/examples/widgets/doc/src/pixelator.qdoc b/examples/widgets/doc/src/pixelator.qdoc deleted file mode 100644 index ab6f639d87..0000000000 --- a/examples/widgets/doc/src/pixelator.qdoc +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/pixelator - \title Pixelator Example - \ingroup examples-itemviews - \brief The Pixelator example shows how delegates can be used to customize the way that - items are rendered in standard item views. - - \image pixelator-example.png - - By default, QTreeView, QTableView, and QListView use a standard item delegate - to display and edit a set of common data types that are sufficient for many - applications. However, an application may need to represent items of data in a - particular way, or provide support for rendering more specialized data types, - and this often requires the use of a custom delegate. - - In this example, we show how to use custom delegates to modify the appearance - of standard views. To do this, we implement the following components: - - \list - \li A model which represents each pixel in an image as an item of data, where each - item contains a value for the brightness of the corresponding pixel. - \li A custom delegate that uses the information supplied by the model to represent - each pixel as a black circle on a white background, where the radius of the - circle corresponds to the darkness of the pixel. - \endlist - - This example may be useful for developers who want to implement their own table - models or custom delegates. The process of creating custom delegates for editing - item data is covered in the \l{Spin Box Delegate Example}{Spin Box Delegate} - example. - - \section1 ImageModel Class Definition - - The \c ImageModel class is defined as follows: - - \snippet itemviews/pixelator/imagemodel.h 0 - - Since we only require a simple, read-only table model, we only need to implement - functions to indicate the dimensions of the image and supply data to other - components. - - \section1 ImageModel Class Implementation - - The constructor is trivial: - - \snippet itemviews/pixelator/imagemodel.cpp 0 - - The \c setImage() function sets the image that will be used by the model: - - \snippet itemviews/pixelator/imagemodel.cpp 1 - - The QAbstractItemModel::reset() call tells the view(s) that the model - has changed. - - The \c rowCount() and \c columnCount() functions return the height and width of - the image respectively: - - \snippet itemviews/pixelator/imagemodel.cpp 2 - \snippet itemviews/pixelator/imagemodel.cpp 3 - - Since the image is a simple two-dimensional structure, the \c parent arguments - to these functions are unused. They both simply return the relevant size from - the underlying image object. - - The \c data() function returns data for the item that corresponds to a given - model index in a format that is suitable for a particular role: - - \snippet itemviews/pixelator/imagemodel.cpp 4 - - In this implementation, we only check that the model index is valid, and that - the role requested is the \l{Qt::ItemDataRole}{DisplayRole}. If so, the function - returns the grayscale value of the relevant pixel in the image; otherwise, a null - model index is returned. - - This model can be used with QTableView to display the integer brightness values - for the pixels in the image. However, we will implement a custom delegate to - display this information in a more artistic way. - - The \c headerData() function is also reimplemented: - - \snippet itemviews/pixelator/imagemodel.cpp 5 - - We return (1, 1) as the size hint for a header item. If we - didn't, the headers would default to a larger size, preventing - us from displaying really small items (which can be specified - using the \uicontrol{Pixel size} combobox). - - \section1 PixelDelegate Class Definition - - The \c PixelDelegate class is defined as follows: - - \snippet itemviews/pixelator/pixeldelegate.h 0 - - This class provides only basic features for a delegate so, unlike the - \l{Spin Box Delegate Example}{Spin Box Delegate} example, we subclass - QAbstractItemDelegate instead of QItemDelegate. - - We only need to reimplement \l{QAbstractItemDelegate::paint()}{paint()} and - \l{QAbstractItemDelegate::sizeHint()}{sizeHint()} in this class. - However, we also provide a delegate-specific \c setPixelSize() function so - that we can change the delegate's behavior via the signals and slots mechanism. - - \section1 PixelDelegate Class Implementation - - The \c PixelDelegate constructor is used to set up a default value for - the size of each "pixel" that it renders. The base class constructor is - also called to ensure that the delegate is set up with a parent object, - if one is supplied: - - \snippet itemviews/pixelator/pixeldelegate.cpp 0 - - Each item is rendered by the delegate's - \l{QAbstractItemDelegate::paint()}{paint()} function. The view calls this - function with a ready-to-use QPainter object, style information that the - delegate should use to correctly draw the item, and an index to the item in - the model: - - \snippet itemviews/pixelator/pixeldelegate.cpp 1 - - The first task the delegate has to perform is to draw the item's background - correctly. Usually, selected items appear differently to non-selected items, - so we begin by testing the state passed in the style option and filling the - background if necessary. - - The radius of each circle is calculated in the following lines of code: - - \snippet itemviews/pixelator/pixeldelegate.cpp 3 - \snippet itemviews/pixelator/pixeldelegate.cpp 4 - - First, the largest possible radius of the circle is determined by taking the - smallest dimension of the style option's \c rect attribute. - Using the model index supplied, we obtain a value for the brightness of the - relevant pixel in the image. The radius of the circle is calculated by - scaling the brightness to fit within the item and subtracting it from the - largest possible radius. - - \snippet itemviews/pixelator/pixeldelegate.cpp 5 - \snippet itemviews/pixelator/pixeldelegate.cpp 6 - \snippet itemviews/pixelator/pixeldelegate.cpp 7 - - We save the painter's state, turn on antialiasing (to obtain smoother - curves), and turn off the pen. - - \snippet itemviews/pixelator/pixeldelegate.cpp 8 - \snippet itemviews/pixelator/pixeldelegate.cpp 9 - - The foreground of the item (the circle representing a pixel) must be - rendered using an appropriate brush. For unselected items, we will use a - solid black brush; selected items are drawn using a predefined brush from - the style option's palette. - - \snippet itemviews/pixelator/pixeldelegate.cpp 10 - - Finally, we paint the circle within the rectangle specified by the style - option and we call \l{QPainter::}{restore()} on the painter. - - The \c paint() function does not have to be particularly complicated; it is - only necessary to ensure that the state of the painter when the function - returns is the same as it was when it was called. This usually - means that any transformations applied to the painter must be preceded by - a call to QPainter::save() and followed by a call to QPainter::restore(). - - The delegate's \l{QAbstractItemDelegate::}{sizeHint()} function - returns a size for the item based on the predefined pixel size, initially set - up in the constructor: - - \snippet itemviews/pixelator/pixeldelegate.cpp 11 - - The delegate's size is updated whenever the pixel size is changed. - We provide a custom slot to do this: - - \snippet itemviews/pixelator/pixeldelegate.cpp 12 - - \section1 Using The Custom Delegate - - In this example, we use a main window to display a table of data, using the - custom delegate to render each cell in a particular way. Much of the - \c MainWindow class performs tasks that are not related to item views. Here, - we only quote the parts that are relevant. You can look at the rest of the - implementation by following the links to the code at the top of this - document. - - In the constructor, we set up a table view, turn off its grid, and hide its - headers: - - \snippet itemviews/pixelator/mainwindow.cpp 0 - \dots - \snippet itemviews/pixelator/mainwindow.cpp 1 - - This enables the items to be drawn without any gaps between them. Removing - the headers also prevents the user from adjusting the sizes of individual - rows and columns. - - We also set the minimum section size to 1 on the headers. If we - didn't, the headers would default to a larger size, preventing - us from displaying really small items (which can be specified - using the \uicontrol{Pixel size} combobox). - - The custom delegate is constructed with the main window as its parent, so - that it will be deleted correctly later, and we set it on the table view. - - \snippet itemviews/pixelator/mainwindow.cpp 2 - - Each item in the table view will be rendered by the \c PixelDelegate - instance. - - We construct a spin box to allow the user to change the size of each "pixel" - drawn by the delegate: - - \snippet itemviews/pixelator/mainwindow.cpp 3 - - This spin box is connected to the custom slot we implemented in the - \c PixelDelegate class. This ensures that the delegate always draws each - pixel at the currently specified size: - - \snippet itemviews/pixelator/mainwindow.cpp 4 - \dots - \snippet itemviews/pixelator/mainwindow.cpp 5 - - We also connect the spin box to a slot in the \c MainWindow class. This - forces the view to take into account the new size hints for each item; - these are provided by the delegate in its \c sizeHint() function. - - \snippet itemviews/pixelator/mainwindow.cpp 6 - - We explicitly resize the columns and rows to match the - \uicontrol{Pixel size} combobox. -*/ diff --git a/examples/widgets/itemviews/CMakeLists.txt b/examples/widgets/itemviews/CMakeLists.txt index 93c36368ce..02b531f932 100644 --- a/examples/widgets/itemviews/CMakeLists.txt +++ b/examples/widgets/itemviews/CMakeLists.txt @@ -9,7 +9,6 @@ qt_internal_add_example(customsortfiltermodel) qt_internal_add_example(editabletreemodel) qt_internal_add_example(fetchmore) qt_internal_add_example(frozencolumn) -qt_internal_add_example(pixelator) qt_internal_add_example(simpletreemodel) qt_internal_add_example(simplewidgetmapper) qt_internal_add_example(spinboxdelegate) diff --git a/examples/widgets/itemviews/itemviews.pro b/examples/widgets/itemviews/itemviews.pro index 3b99ff9606..9fa7e6c9c9 100644 --- a/examples/widgets/itemviews/itemviews.pro +++ b/examples/widgets/itemviews/itemviews.pro @@ -7,7 +7,6 @@ SUBDIRS = addressbook \ editabletreemodel \ fetchmore \ frozencolumn \ - pixelator \ simpledommodel \ simpletreemodel \ simplewidgetmapper \ diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp index df6e77e8bd..5c2f00913a 100644 --- a/src/widgets/dialogs/qprogressdialog.cpp +++ b/src/widgets/dialogs/qprogressdialog.cpp @@ -217,7 +217,7 @@ void QProgressDialogPrivate::_q_disconnectOnClose() \image fusion-progressdialog.png A progress dialog shown in the Fusion widget style. - \sa QDialog, QProgressBar, {Pixelator Example} + \sa QDialog, QProgressBar */ diff --git a/src/widgets/doc/src/model-view-programming.qdoc b/src/widgets/doc/src/model-view-programming.qdoc index 09faebacd9..5d620716a6 100644 --- a/src/widgets/doc/src/model-view-programming.qdoc +++ b/src/widgets/doc/src/model-view-programming.qdoc @@ -690,9 +690,6 @@ The first approach is covered later in this section, and it is also shown in the \l{Spin Box Delegate Example}{Spin Box Delegate} example. - The \l{Pixelator Example}{Pixelator} example shows how to create a - custom delegate that performs specialized rendering for a table view. - \section2 Using an existing delegate The standard views provided with Qt use instances of \l QStyledItemDelegate @@ -2312,7 +2309,6 @@ \list \li \l{itemviews/spinboxdelegate}{Spin Box Delegate} - \li \l{itemviews/pixelator}{Pixelator} \li \l{itemviews/simpletreemodel}{Simple Tree Model} \endlist */ diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp index 73af3b6b1d..59caed1699 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.cpp +++ b/src/widgets/itemviews/qabstractitemdelegate.cpp @@ -81,7 +81,7 @@ QT_BEGIN_NAMESPACE The second approach is to handle user events directly by reimplementing editorEvent(). - \sa {model-view-programming}{Model/View Programming}, {Pixelator Example}, + \sa {model-view-programming}{Model/View Programming}, QStyledItemDelegate, QStyle */ diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp index ad3898e8d9..1c1dec68d2 100644 --- a/src/widgets/itemviews/qitemdelegate.cpp +++ b/src/widgets/itemviews/qitemdelegate.cpp @@ -342,8 +342,10 @@ QString QItemDelegatePrivate::valueToText(const QVariant &value, const QStyleOpt For example, a selected item may need to be displayed differently to unselected items, as shown in the following code: - \snippet itemviews/pixelator/pixeldelegate.cpp 2 - \dots + \code + if (option.state & QStyle::State_Selected) + painter->fillRect(option.rect, option.palette.highlight()); + \endcode After painting, you should ensure that the painter is returned to its the state it was supplied in when this function was called. For example, diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index 2dbff090bc..a048368967 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -1188,7 +1188,7 @@ int QTableViewPrivate::heightHintForIndex(const QModelIndex &index, int hint, QS operations between x-coordinates and column indexes. \sa QTableWidget, {View Classes}, QAbstractItemModel, QAbstractItemView, - {Pixelator Example}, {Table Model Example} + {Table Model Example} */ /*! diff --git a/examples/widgets/itemviews/pixelator/CMakeLists.txt b/tests/manual/examples/widgets/itemviews/pixelator/CMakeLists.txt similarity index 100% rename from examples/widgets/itemviews/pixelator/CMakeLists.txt rename to tests/manual/examples/widgets/itemviews/pixelator/CMakeLists.txt diff --git a/examples/widgets/itemviews/pixelator/imagemodel.cpp b/tests/manual/examples/widgets/itemviews/pixelator/imagemodel.cpp similarity index 100% rename from examples/widgets/itemviews/pixelator/imagemodel.cpp rename to tests/manual/examples/widgets/itemviews/pixelator/imagemodel.cpp diff --git a/examples/widgets/itemviews/pixelator/imagemodel.h b/tests/manual/examples/widgets/itemviews/pixelator/imagemodel.h similarity index 100% rename from examples/widgets/itemviews/pixelator/imagemodel.h rename to tests/manual/examples/widgets/itemviews/pixelator/imagemodel.h diff --git a/examples/widgets/itemviews/pixelator/images.qrc b/tests/manual/examples/widgets/itemviews/pixelator/images.qrc similarity index 100% rename from examples/widgets/itemviews/pixelator/images.qrc rename to tests/manual/examples/widgets/itemviews/pixelator/images.qrc diff --git a/examples/widgets/itemviews/pixelator/images/qt.png b/tests/manual/examples/widgets/itemviews/pixelator/images/qt.png similarity index 100% rename from examples/widgets/itemviews/pixelator/images/qt.png rename to tests/manual/examples/widgets/itemviews/pixelator/images/qt.png diff --git a/examples/widgets/itemviews/pixelator/main.cpp b/tests/manual/examples/widgets/itemviews/pixelator/main.cpp similarity index 100% rename from examples/widgets/itemviews/pixelator/main.cpp rename to tests/manual/examples/widgets/itemviews/pixelator/main.cpp diff --git a/examples/widgets/itemviews/pixelator/mainwindow.cpp b/tests/manual/examples/widgets/itemviews/pixelator/mainwindow.cpp similarity index 100% rename from examples/widgets/itemviews/pixelator/mainwindow.cpp rename to tests/manual/examples/widgets/itemviews/pixelator/mainwindow.cpp diff --git a/examples/widgets/itemviews/pixelator/mainwindow.h b/tests/manual/examples/widgets/itemviews/pixelator/mainwindow.h similarity index 100% rename from examples/widgets/itemviews/pixelator/mainwindow.h rename to tests/manual/examples/widgets/itemviews/pixelator/mainwindow.h diff --git a/examples/widgets/itemviews/pixelator/pixelator.pro b/tests/manual/examples/widgets/itemviews/pixelator/pixelator.pro similarity index 100% rename from examples/widgets/itemviews/pixelator/pixelator.pro rename to tests/manual/examples/widgets/itemviews/pixelator/pixelator.pro diff --git a/examples/widgets/itemviews/pixelator/pixeldelegate.cpp b/tests/manual/examples/widgets/itemviews/pixelator/pixeldelegate.cpp similarity index 100% rename from examples/widgets/itemviews/pixelator/pixeldelegate.cpp rename to tests/manual/examples/widgets/itemviews/pixelator/pixeldelegate.cpp diff --git a/examples/widgets/itemviews/pixelator/pixeldelegate.h b/tests/manual/examples/widgets/itemviews/pixelator/pixeldelegate.h similarity index 100% rename from examples/widgets/itemviews/pixelator/pixeldelegate.h rename to tests/manual/examples/widgets/itemviews/pixelator/pixeldelegate.h