0. 源代码下载
https://github.com/leichaojian/qt/tree/master/ColorListEditor
1. 程序效果图
2. 源代码解析
1. 主框架类Window的实现
初始化工作:实现默认的三个map<Name, Hair Color>:(Alice, aliceblue),(Neptun, aquamarine)和(Ferdinand, springgreen):
void Window::createGUI()
{
QList<QPair<QString, QColor> > list;
//新建三个默认的姓名--颜色对应数据
list << QPair<QString, QColor>(tr("Alice"), QColor("aliceblue")) <<
QPair<QString, QColor>(tr("Neptun"), QColor("aquamarine")) <<
QPair<QString, QColor>(tr("Ferdinand"), QColor("springgreen"));
//新建三行两列的数据
QTableWidget *table = new QTableWidget(3, 2);
//设定头部信息
table->setHorizontalHeaderLabels(QStringList() << tr("Name")
<< tr("Hair Color"));
//Name这一列不可更改
table->verticalHeader()->setVisible(false);
table->resize(150, 50);
//插入数据
for (int i = 0; i < 3; ++i) {
QPair<QString, QColor> pair = list.at(i);
QTableWidgetItem *nameItem = new QTableWidgetItem(pair.first);
QTableWidgetItem *colorItem = new QTableWidgetItem;
colorItem->setData(Qt::DisplayRole, pair.second);
table->setItem(i, 0, nameItem);
table->setItem(i, 1, colorItem);
}
table->resizeColumnToContents(0);
table->horizontalHeader()->setStretchLastSection(true);
QGridLayout *layout = new QGridLayout;
layout->addWidget(table, 0, 0);
setLayout(layout);
setWindowTitle(tr("Color Editor Factory"));
}
在主框架中新建一个ColorListEditor编辑器:
//QItemEditorFactory提供一个widget,用来在视图中编辑数据
QItemEditorFactory *factory = new QItemEditorFactory;
//新建一个ColorListEditor编辑器
QItemEditorCreatorBase *colorListCreator =
new QStandardItemEditorCreator<ColorListEditor>();
//将图像编辑器注册到QItemEditorFactory中
factory->registerEditor(QVariant::Color, colorListCreator);
QItemEditorFactory::setDefaultFactory(factory);
2. ColorListEditor编辑器的实现
自定义颜色属性:
Q_PROPERTY(QColor color READ color WRITE setColor USER true)
其中,color()和setColor()的实现如下:
//返回所选择的数据---选择的数据存储在Qt::DecorationRole
QColor ColorListEditor::color() const
{
return qvariant_cast<QColor>(itemData(currentIndex(), Qt::DecorationRole));
}
//从Qt::DecorationRole中将选择到的颜色属性设置为当前的选项
void ColorListEditor::setColor(QColor color)
{
setCurrentIndex(findData(color, int(Qt::DecorationRole)));
}
而关键的populateList()函数实现如下(将颜色数据罗列在列表框下):
//得到所有颜色属性并插入到列表框中
void ColorListEditor::populateList()
{
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);
}
}