Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。
Qt提供了许多功能,可以以不同的方式显示预先和用户定义的项模型,模型/视图体系结构引入的功能分离为开发人员定制项的表示提供了更大的灵活性。
点击获取Qt Widget组件下载(Q技术交流:166830288)
颜色编辑器示例
本示例演示如何创建QItemDelegate可以使用的编辑器。
在QListView、QTableView或QTreeView中编辑数据时,编辑器由委托创建和显示。QItemDelegate是Qt的项目视图使用的默认委托,它使用QItemEditorFactory为它创建编辑器,QItemEditorFactory提供的唯一实例默认安装在所有项目委托上。
项目编辑器包含QItemEditorCreatorBase实例的集合,这些实例为特定的QVariant数据类型生成编辑器(Qt中的所有模型都将数据存储在QVariant中),编辑器可以是任何Qt或自定义小部件。
在本例中,我们将创建一个编辑器(在ColorListEditor类中实现),它可以编辑QColor数据类型并由qitemdelegate使用。为此,我们创建了一个新的QItemEditorCreatorBase,该QItemEditorCreatorBase生成colorlisteditor并将其注册到一个新工厂,我们将其设置为默认的编辑器项工厂(唯一的工厂实例)。为了测试编辑器,我们实现了Window类,它显示一个QTableWidget,可以在其中编辑QColors。
窗口类实现
在窗口类中,为颜色编辑器创建项目编辑器基础,并将其添加到默认工厂。同时还添加了一个QTableWidget,可以在其中测试编辑器,它填充了一些数据并显示在窗口中。
仔细看看构造函数:
Window::Window()
{
QItemEditorFactory *factory = new QItemEditorFactory;
QItemEditorCreatorBase *colorListCreator =
new QStandardItemEditorCreator<ColorListEditor>();
factory->registerEditor(QMetaType::QColor, colorListCreator);
QItemEditorFactory::setDefaultFactory(factory);
createGUI();
}
QStandardItemEditorCreator是一个继承了QItemEditorCreatorBase的方便类,它的构造函数接受一个模板类,其实例从createWidget()返回。创建者使用一个构造函数,该构造函数将QWidget作为惟一参数;模板类必须提供这一点,这样,就不需要创建QStandardItemEditorCreator的子类。
在设置了新工厂之后,所有标准项目委托都将使用它(也就是,在设置新的默认工厂之前创建的委托)。
createGUI()函数设置表并用数据填充它。
ColorListEditor定义
ColorListEditor继承了QComboBox,并让用户从弹出列表中选择一个QColor。
class ColorListEditor : public QComboBox
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor USER true)
public:
ColorListEditor(QWidget *widget = nullptr);
public:
QColor color() const;
void setColor(const QColor &color);
private:
void populateList();
};
QItemDelegate 管理编辑器和模型之间的交互,它从模型中检索要编辑的数据,并将来自编辑器的数据存储在模型中。编辑器编辑的数据存储在编辑器的用户数据属性中,委托使用Qt的属性系统按名称访问它。我们使用Q_PROPERTY宏声明用户数据属性,属性被设置为具有user关键字的用户类型。
ColorListEditor实现
ColorListEditor的构造函数简单地调用populateList(),稍后我们将讨论它,接下来看color()函数:
QColor ColorListEditor::color() const
{
return qvariant_cast<QColor>(itemData(currentIndex(), Qt::DecorationRole));
}
我们返回在组合框中选择的数据,数据存储在Qt::DecorationRole中,然后颜色也显示在弹出列表中(如上图所示)。
void ColorListEditor::setColor(const QColor &color)
{
setCurrentIndex(findData(color, Qt::DecorationRole));
}
findData()函数搜索组合框中的项目,并返回Qt::Decoration角色中有颜色的项目索引。
void ColorListEditor::populateList()
{
const QStringList colorNames = QColor::colorNames();
for (int i = 0; i < colorNames.size(); ++i) {
QColor color(colorNames[i]);
insertItem(i, colorNames[i]);
setItemData(i, color, Qt::DecorationRole);
}
}
Qt通过名称知道一些预定义的颜色,只需循环遍历这些元素,用项填充编辑器。
Qt Widget组件推荐
- QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
- QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
- QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
- QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!