带有行图标的QTableView

8

我有一个显示数据库表行的 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
希望这能对你的回答有所帮助。
2个回答

9

我看到你已经选择了一个答案,但是因为你正在学习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


非常感谢您的回答,Derick。事实上,我有一种感觉可以使用委托来完成这个任务,我也尝试了一些示例。也感谢您的示例。 - kasper360
2
引用:“因此,您需要在data()函数中为DisplayRole返回QIcon或QPixmap。”...您是指DisplayRole还是DecorationRole - HiFile.app - best file manager

7

将您的项目的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);
}

像这样应该可以工作。 在设置模型之前设置值。

我没有测试过,但我认为你可以从中得到思路。


谢谢justanothercoder。但是我需要比那更详细的描述,因为我对Qt完全不熟悉。我在开发这个应用程序的同时学习Qt。 - kasper360
我有点不知道从哪里开始,你需要更详细地描述你所做的事情。在问题中添加一些源代码可能会很好。 - 0xbaadf00d
我修改了原始问题并添加了代码片段。 - kasper360
非常感谢justanothercoder。我会尝试并告诉您结果的。 :) - kasper360

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接