跟我一起学QT13:颜色编辑器

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);
    }
}




转载于:https://my.oschina.net/voler/blog/347879

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值