QTableView与行中的图标

时间:2011-04-04 06:20:48

标签: c++ qt icons qtableview

我有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 个答案:

答案 0 :(得分:5)

将商品的 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之前设置值。

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

答案 1 :(得分:4)

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