QTableView与行中的图标

kas*_*360 5 c++ icons qt 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);
Run Code Online (Sandbox Code Playgroud)

"serendibMsgTableModel"是一个QSqlQueryModel和"serendibMsgProxyModel"是自定义的QSortFilterProxyModel."serendibMsgView"是QTableView我需要在"数据类型"列中显示的图标.

希望这有助于你的答案.

Der*_*bee 7

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

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

QVariant QSqlTableModel::data ( 
            const QModelIndex & index,
            int role = Qt::DisplayRole ) const   [virtual]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • 引用:“因此,您需要做的是在 DisplayRole 的 data() 函数中返回 QIcon 或 QPixmap。” ...您是指“DisplayRole”还是“DecorationRole”? (2认同)

0xb*_*00d 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);
}
Run Code Online (Sandbox Code Playgroud)

这样的事情应该有效.在setModel之前设置值.

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