我已经将QAbstractTableModel子类化了,而在data()函数中,我在每行的最后一列显示一个图像,并在鼠标悬停时显示工具提示。
QVariant MyTableModel::data(const QModelIndex& index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole)
{
switch (index.column())
{
// few cases
default:
return QVariant();
}
}
else if (role == Qt::CheckStateRole && index.column() == 0)
{
int state= tableData.at(index.row()).state;
if (state)
return Qt::Checked;
else
return Qt::Unchecked;
}
else if (role == Qt::DecorationRole && index.column() == 7 && index.row() > 1)
{
QPixmap pixMap(fileName);
return pixMap;
}
else if (role == Qt::ToolTipRole && index.column() == 7 && index.row() > 1)
{
return QString("Delete");
}
else
return QVariant();
}
工具提示文本在每一行都显示得很好但是当我将光标从一行的最后一列移动到它下面的另一列(或它下面的任何一行)时,工具提示仍保留在上一行。
如果在移动到另一行的最后一列之前将光标移动到任何其他单元格,则此问题不会持续存在。 谢谢你的帮助。
答案 0 :(得分:1)
当显示为工具提示的数据对于视图中的不同项目是相同的时,工具提示位置不会被调整。不确定这是设计特征还是错误 - 需要查看Qt源代码。
你可以很容易地解决这个问题。在Qt文档中,您可以找到这样的信息:
请注意,如果要在项目视图中显示工具提示,请执行以下操作: 模型/视图架构提供了设置项目工具的功能 小费;例如,QTableWidgetItem :: setToolTip()函数。但是,如果 您希望在项目视图中提供自定义工具提示 拦截QAbstractItemView :: viewportEvent()中的帮助事件 功能并自己处理。
因此,对视图进行子类化并覆盖viewportEvent
方法可以解决您的问题。