如何访问委托的paint()函数内的另一个索引?

时间:2018-08-08 16:24:04

标签: c++ qt qt5 qabstracttablemodel qstyleditemdelegate

当鼠标悬停在表格的某个单元格上方时,我需要为该单元格的整个行创建一个效果。这意味着我需要访问另一个索引。

在这种情况下,我做了一个for循环,从表的第一列到最后一列运行并为其设置效果。但这行不通。偏离路线,因为命令drawText没有任何输入参数作为索引。在这种情况下,如何设置另一个索引的效果?

也欢迎其他解决方案。谢谢!

--settings

1 个答案:

答案 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(); } 创建了自己的模型,因此必须实现QAbstractTableModelsetData()方法来处理data()Qt::ForegroundRole角色。 / p>

在我的示例中,每个项目都具有以下结构:

Qt::BackgroundRole

然后,假设上述方法应为如下,模型必须将数据保存在struct Item{ QString text=""; QBrush textColor=Qt::black; QBrush bgColor=Qt::white; }; 中:

QList<QList<Item>> m_items;

完整的示例可以在下面的link

中找到