6

我有一个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我需要在数据类型列中显示的图标。

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

4

2 回答 2

7

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

于 2011-04-04T12:58:43.623 回答
6

将您的项目的装饰角色设置为您想要的 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 之前设置值。

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

于 2011-04-04T06:50:58.013 回答