【问题标题】:QTableView with icons in rows带有行中图标的 QTableView
【发布时间】:2011-04-04 06:20:47
【问题描述】:

我有一个QTableView 显示数据库表的行。在此表中,我有一列称为数据类型,并且每种类型都有图标图像。如何在每种数据类型前面添加这些图标?

这是 justanothercoder 要求的我的代码的一部分。

QString msgQueryString = "select MESSAGE_ID, DATA_TYPE from SER_MESSAGES where MESSAGE_ID > 500 ";
serendibMsgTableModel->setQuery(msgQueryString, *database);
serendibMsgTableModel->setHeaderData(0, Qt::Horizontal, tr("Message ID"));
serendibMsgTableModel->setHeaderData(1, Qt::Horizontal, tr("Data Type"));

serendibMsgProxyModel->setSourceModel(serendibMsgTableModel);
serendibMsgView->setModel(serendibMsgProxyModel);

“serendibMsgTableModel”是一个QSqlQueryModel,“serendibMsgProxyModel”是一个定制的QSortFilterProxyModel。 “serendibMsgView”是QTableView 我需要在数据类型列中显示图标。

希望这对您的回答有所帮助。

【问题讨论】:

    标签: c++ qt icons qtableview


    【解决方案1】:

    我看到您已经选择了一个答案,但是由于您正在学习 Qt,所以我将添加一些内容。

    看看优秀的 Qt 文档,我建议你在你的模型中覆盖它:

    QVariant QSqlTableModel::data ( 
                const QModelIndex & index,
                int role = Qt::DisplayRole ) const   [virtual]
    

    有多种角色(int role = Qt::DisplayRole):

    枚举 Qt::ItemDataRole : 模型中的每个项目都有一组 与之关联的数据元素,每个 有自己的作用。使用的角色 通过视图向模型指示 它需要哪种类型的数据。风俗 模型应该返回这些数据 类型。

    Qt::DecorationRole : 数据 呈现为形式的装饰 的图标。 (QColor、QIcon 或 Qpixmap)

    因此,您需要在 DisplayRole 的 data() 函数中返回一个 QIcon 或 QPixmap。

    另一种可能更合适的方法是使用代表:例如ColorListEditor

    【讨论】:

    • 非常感谢德里克的回答。事实上,我有一种感觉,我可以使用委托来完成这项任务,并且我也一直在尝试一些示例。也感谢您的示例。
    • 引用:“因此,您需要做的是在 DisplayRole 的 data() 函数中返回一个 QIcon 或 QPixmap。” ...您的意思是DisplayRole 还是DecorationRole
    【解决方案2】:

    将您的项目的 DecorationRole 设置为您想要的 QPixmap,它应该可以工作。

    编辑:

    我猜图标取决于数据类型列中的值。

    int rowCount = serendibMsgTableModel->rowCount();
    
    for(int row = 0; row < rowCount; row++)
    {
        QModelIndex index = serendibMsgTableModel->index(row, 1);
        QVariant value = serendibMsgTableModel->data(index);
        static QPixmap s_invalidIcon(PATH_TO_INVALID_ICON);
        static QPixmap s_type1Icon(PATH_TO_TYPE1_ICON);
        static QPixmap s_type2Icon(PATH_TO_TYPE2_ICON);
    
        QPixmap icon(s_invalidIcon);
    
        if(value.toString() == "type1")
        {
            icon = s_type1Icon;
        }
        else if(value.toString() == "type2")
        {
            icon = s_type2Icon;
        }
        serendibMsgTableModel->setData(index, icon, Qt::DecorationRole);
    }
    

    这样的事情应该可以工作。 设置 setModel 之前的值。

    我还没有测试过,但我认为你应该从中得到这个想法。

    【讨论】:

    • 感谢 justanothercoder。但我需要比这更详细的描述,因为我对 Qt 完全陌生。我在开发这个应用程序时正在学习 Qt。
    • 我有点不知道从哪里开始,您需要添加更多关于您所做工作的描述。在问题中添加一些源代码可能会很好。
    • 我已经修改了原问题并添加了代码sn-p。
    • 非常感谢 justanothercoder。我会试试这个,让你知道它是怎么回事。 :)
    猜你喜欢
    • 2011-09-21
    • 2013-05-10
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多