当鼠标悬停在表格的某个单元格上方时,我需要为该单元格的整个行创建一个效果。这意味着我需要访问另一个索引。
在这种情况下,我做了一个for循环,从表的第一列到最后一列运行并为其设置效果。但这行不通。偏离路线,因为命令drawText没有任何输入参数作为索引。在这种情况下,如何设置另一个索引的效果?
也欢迎其他解决方案。谢谢!
--settings
答案 0 :(得分:1)
我了解如果您将鼠标放在行中的任何项目上,您想产生改变行文本颜色的效果,我认为为此不必使用委托,只需启用{{1 }}并覆盖mouseTracking
方法。
mouseMoveEvent
更新:
由于已经使用#include <QApplication>
#include <QMouseEvent>
#include <QStandardItemModel>
#include <QTableView>
class TableView: public QTableView{
public:
TableView(QWidget *parent = nullptr):
QTableView(parent)
{
setMouseTracking(true);
}
protected:
void mouseMoveEvent(QMouseEvent *event)
{
QModelIndex ix = indexAt(event->pos());
if(mRow != ix.row()){
changeRowColor(mRow);
if(ix.isValid())
changeRowColor(ix.row(), Qt::green, Qt::blue);
mRow = ix.row();
}
QTableView::mouseMoveEvent(event);
}
void leaveEvent(QEvent *event)
{
changeRowColor(mRow);
QTableView::leaveEvent(event);
}
private:
void changeRowColor(int row, const QColor & textColor=Qt::black, const QColor &backgroundColor=Qt::white){
if(!model())
return;
for(int i=0; i< model()->columnCount(); i++){
model()->setData(model()->index(row, i), textColor, Qt::ForegroundRole);
model()->setData(model()->index(row, i), backgroundColor, Qt::BackgroundRole);
}
}
int mRow = -1;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TableView w;
QStandardItemModel model(5, 5);
for(int i=0; i < model.rowCount(); i++){
for(int j=0; j < model.columnCount(); j++){
model.setItem(i, j, new QStandardItem(QString("%1-%2").arg(i).arg(j)));
}
}
w.setModel(&model);
w.show();
return a.exec();
}
创建了自己的模型,因此必须实现QAbstractTableModel
和setData()
方法来处理data()
和Qt::ForegroundRole
角色。 / p>
在我的示例中,每个项目都具有以下结构:
Qt::BackgroundRole
然后,假设上述方法应为如下,模型必须将数据保存在struct Item{
QString text="";
QBrush textColor=Qt::black;
QBrush bgColor=Qt::white;
};
中:
QList<QList<Item>> m_items;
完整的示例可以在下面的link
中找到