警告

本节包含自动将C++翻译为Python的代码片段,可能包含错误。

颜色编辑器工厂示例#

本示例演示如何创建一个可以由QStyledItemDelegate使用的编辑器。

../_images/coloreditorfactoryimage.png

QListViewQTableViewQTreeView中编辑数据时,编辑器由一个代理创建和显示。默认的代理是Qt的项视图使用的QStyledItemDelegate,它使用一个QItemEditorFactory来创建对应的编辑器。默认在每个项代理上安装了由QItemEditorFactory提供的独特实例。

项编辑器工厂包含一组QItemEditorCreatorBase实例,这些是针对特定QVariant数据类型(Qt中所有模型都将数据存储在QVariants中)的专用工厂。一个编辑器可以是任何Qt或自定义小部件。

在以下示例中,我们将创建一个编辑器(在 ColorListEditor 类中实现)可以编辑 QColor 数据类型,并供 QStyledItemDelegate 使用。我们通过创建一个新的 QItemEditorCreatorBase,该基类生成 ColorListEditors 并将其注册到一个新工厂中,我们将它设置为默认编辑器项目工厂(唯一工厂实例)。为了测试我们的编辑器,我们已经实现了 Window 类,该类显示一个 QTableWidget,其中 QColors 可以被编辑。

Window 类实现#

在 Window 类中,我们创建颜色编辑器的基类编辑器并添加到默认工厂中。我们还创建了一个 QTableWidget,其中可以测试我们的编辑器。它包含了一些数据,并在窗口中显示。

我们详细查看构造函数

def __init__(self):

    factory = QItemEditorFactory()
    colorListCreator =
        QStandardItemEditorCreator()<ColorListEditor>()
    factory.registerEditor(QMetaType.QColor, colorListCreator)
    QItemEditorFactory.setDefaultFactory(factory)
    createGUI()

QStandardItemEditorCreator 是一个便利类,它继承自 QItemEditorCreatorBase 。其构造函数接受一个模板类,该类的实例由 createWidget() 返回。创建器使用一个只接受 QWidget 作为唯一参数的构造函数;模板类必须提供它。这样,就无需子类化 QStandardItemEditorCreator 了。

新工厂设置后,所有标准项目代理都将使用它(即,在设置新默认工厂之前创建的代理)。

createGUI() 函数设置表格并填充数据。

ColorListEditor 定义#

ColorListEditor 继承自 QComboBox 并允许用户从其下拉列表中选择 QColor。

class ColorListEditor(QComboBox):

    Q_OBJECT
    Q_PROPERTY(QColor color READ color WRITE setColor USER True)
# public
    ColorListEditor(QWidget widget = None)
# public
    color = QColor()
    def setColor(color):
# private
    def populateList():

QStyledItemDelegate 议员管理编辑器和模型之间的交互,即从模型检索要编辑的数据并将在编辑器中存储的数据存储在模型中。由编辑器编辑的数据存储在编辑器的用户数据属性中,而代理使用 Qt 的属性系统通过名称访问它。我们使用 Q_PROPERTY 宏声明我们的用户数据属性。该属性设置为带有 USER 关键词的用户类型。

ColorListEditor 实现细节#

ColorListEditor 的构造函数仅仅是调用 populateList() 方法,我们稍后会被介绍。接下来,我们看看 color() 函数。

def color(self):

    return QColor(itemData(currentIndex(), Qt.DecorationRole))

我们返回在组合框中选中的数据。数据以 Qt::DecorationRole 格式存储,因为颜色同时也显示在弹出列表中(如上图所示)。

def setColor(self, color):

    setCurrentIndex(findData(color, Qt.DecorationRole))

findData() 函数在组合框中搜索项目,并返回包含 Qt::Decoration 角色的 color 的项目索引。

def populateList(self):

    colorNames = QColor.colorNames()
    for i in range(0, colorNames.size()):
        color = QColor(colorNames[i])
        insertItem(i, colorNames[i])
        setItemData(i, color, Qt.DecorationRole)

Qt 认识一些通过名称定义的预定义颜色。我们简单地遍历这些颜色,以用项目填充我们的编辑器。

进一步个性化项目视图编辑器#

您可以通过多种方式个性化 Qt 的 模型视图框架。本例中显示的程序通常足以提供自定义编辑器。进一步定制是通过继承 QItemEditorFactoryQItemEditorCreatorBase 来实现的。如果您根本不想使用工厂,还可以继承 QStyledItemDelegate

可能的建议是

  • 如果编辑器小部件没有定义用户属性,则委托请求工厂的属性名称,该工厂随后又请求项目编辑创建者。

  • 如果编辑器需要其他构造函数或其他初始化方式,而不是由 QItemEditorCreatorBase 提供的,则必须重新实现 createWidget()

  • 如果您只想为某些类型的数据提供编辑器或使用不同于使用创建基的创建编辑器的方法,也可以继承 QItemEditorFactory

在此示例中,我们使用标准 QVariant 数据类型。您也可以使用自定义类型。在 星委托示例 中,我们展示了如何将自定义数据类型存储在 QVariant 中,并在继承自 QStyledItemDelegate 的类中绘制和编辑它。

示例项目 @ code.qt.io