| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \example itemviews/coloreditorfactory |
| \title Color Editor Factory Example |
| \ingroup examples-itemviews |
| \brief This example shows how to create an editor that can be used by |
| a QItemDelegate. |
| |
| \image coloreditorfactoryimage.png |
| |
| When editing data in a QListView, QTableView, or QTreeView, |
| editors are created and displayed by a \l{Delegate |
| Classes}{delegate}. QItemDelegate, which is the default delegate |
| used by Qt's \l{View Classes}{item views}, uses a |
| QItemEditorFactory to create editors for it. A unique instance |
| provided by QItemEditorFactory is by default installed on all |
| item delegates. |
| |
| An item editor factory contains a collection of |
| QItemEditorCreatorBase instances, which are specialized factories |
| that produce editors for one particular QVariant data type (all |
| models in Qt store their data in \l{QVariant}s). An editor can be any |
| Qt or custom widget. |
| |
| In this example, we will create an editor (implemented in the \c |
| ColorListEditor class) that can edit the QColor data type and be |
| used by \l{QItemDelegate}s. We do this by creating a new |
| QItemEditorCreatorBase that produces \c ColorListEditors and |
| register it with a new factory, which we set as the default editor |
| item factory (the unique factory instance). To test our editor, we |
| have implemented the \c Window class, which displays a |
| QTableWidget in which \l{QColor}s can be edited. |
| |
| \section1 Window Class Implementation |
| |
| In the Window class, we create the item editor creator |
| base for our color editor and add it to the default factory. |
| We also create a QTableWidget in which our editor can be |
| tested. It is filled with some data and displayed in a window. |
| |
| We take a closer look at the constructor: |
| |
| \snippet itemviews/coloreditorfactory/window.cpp 0 |
| |
| The QStandardItemEditorCreator is a convenience class that |
| inherits QItemEditorCreatorBase. Its constructor takes a template |
| class, of which instances are returned from |
| \l{QItemEditorCreatorBase::}{createWidget()}. The creator uses a |
| constructor that takes a QWidget as its only parameter; the |
| template class must provide this. This way, there is no need to |
| subclass QStandardItemEditorCreator. |
| |
| After the new factory has been set, all standard item delegates |
| will use it (i.e, also delegates that were created before the new |
| default factory was set). |
| |
| The \c createGUI() function sets up the table and fills it |
| with data. |
| |
| \section1 ColorListEditor Definition |
| |
| The ColorListEditor inherits QComboBox and lets the user |
| select a QColor from its popup list. |
| |
| \snippet itemviews/coloreditorfactory/colorlisteditor.h 0 |
| |
| QItemDelegate manages the interaction between the editor and |
| the model, i.e., it retrieves data to edit from the model and |
| store data from the editor in the model. The data that is edited |
| by an editor is stored in the editor's user data property, and the |
| delegate uses Qt's \l{Qt's Property System}{property system} to |
| access it by name. We declare our user data property with the |
| Q_PROPERTY macro. The property is set to be the user type with the |
| USER keyword. |
| |
| \section1 ColorListEditor Implementation |
| |
| The constructor of \c ColorListEditor simply calls \c |
| populateList(), which we will look at later. We move on to the |
| \c color() function: |
| |
| \snippet itemviews/coloreditorfactory/colorlisteditor.cpp 0 |
| |
| We return the data that is selected in the combobox. The data |
| is stored in the Qt::DecorationRole as the color is then also |
| displayed in the popup list (as shown in the image above). |
| |
| \snippet itemviews/coloreditorfactory/colorlisteditor.cpp 1 |
| |
| The \c findData() function searches the items in the combobox |
| and returns the index of the item that has \c color in the |
| Qt::Decoration role. |
| |
| \snippet itemviews/coloreditorfactory/colorlisteditor.cpp 2 |
| |
| Qt knows some predefined colors by name. We simply loop |
| through these to fill our editor with items. |
| |
| \section1 Further Customization of Item View Editors |
| |
| You can customize Qt's \l{Model/View Programming}{model view |
| framework} in many ways. The procedure shown in this example is |
| usually sufficient to provide custom editors. Further |
| customization is achieved by subclassing QItemEditorFactory |
| and QItemEditorCreatorBase. It is also possible to subclass |
| QItemDelegate if you don't wish to use a factory at all. |
| |
| Possible suggestions are: |
| |
| \list |
| \li If the editor widget has no user property defined, the delegate |
| asks the factory for the property name, which it in turn |
| asks the item editor creator for. In this case, you can use |
| the QItemEditorCreator class, which takes the property |
| name to use for editing as a constructor argument. |
| \li If the editor requires other constructors or other |
| initialization than provided by QItemEditorCreatorBase, you |
| must reimplement |
| QItemEditorCreatorBase::createWidget(). |
| \li You could also subclass QItemEditorFactory if you only want |
| to provide editors for certain kinds of data or use another |
| method of creating the editors than using creator bases. |
| \endlist |
| |
| In this example, we use a standard QVariant data type. You can |
| also use custom types. In the \l{Star Delegate Example}, we |
| show how to store a custom data type in a QVariant and paint |
| and edit it in a class that inherits QItemDelegate. |
| */ |