我有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
我需要在“数据类型”列中显示的图标。
希望这有助于您的回答。
答案 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