Qt QTableView 在活动单元格周围绘制边框

Posted

技术标签:

【中文标题】Qt QTableView 在活动单元格周围绘制边框【英文标题】:Qt QTableView draw border around active cells 【发布时间】:2011-06-29 04:16:43 【问题描述】:

我正在尝试在 QTableView 中实现类似于 Excel 的行为,其中在整个当前选择周围绘制边框。我已经尝试过这种感觉就像一百种不同的方法并且不断遇到问题。我可以很容易地绘制边框,但是只要选择更改,就会留下边框的残留物。这是我在 QTableView::paintEvent 中尝试过的一个示例 ...


void MyTableView::paintEvent(QPaintEvent* event)

    // call QTableView's paint event first so we can draw over it
    QTableView::paintEvent(event);

    // activeSelection is a list of indexes that is updated in another function
    // the function also calls QTableView::repaint whenever this list changes
    // in an attempt to erase the previously drawn border
    if(!activeSelection.size())
        return;

    QRect rect = visualRect(activeSelection.at(0)) |
           visualRect(activeSelection.at(activeSelection.size() - 1));
    // temporarily draw smaller border so it doesn't lie on the grid lines
    rect.adjust(4, 4, -4, -4);
    QPen pen(Qt::black, 2);
    QPainter painter(viewport());
    painter.setPen(pen);
    painter.drawRect(rect);

该代码产生诸如this之类的结果

我很乐意提供有关如何使其运行更顺利的任何建议。我曾尝试在委托中执行此操作,但是委托需要知道所有选择的索引,并且它无法在 QTableView 绘制的网格线上绘制。另外,我的表格类需要知道边框的绘制位置。

【问题讨论】:

【参考方案1】:

尝试调用 update();在您的 selectionChanged 函数中。这会减慢您的实施速度,但会删除垃圾。

【讨论】:

谢谢!它现在工作得更好了。尽管如此,仍然有一些剩余,就像你看到的here。如果你知道那是怎么回事,请告诉我,否则你已经帮了很多忙了。 附录:我修复了它 - 如果你调用 viewport()->update();相反,它解决了所有问题。谢谢!

以上是关于Qt QTableView 在活动单元格周围绘制边框的主要内容,如果未能解决你的问题,请参考以下文章

Qt 中 QTableView 中如何设置某一单元格文本的颜色值,希望能贴出代码。

单击表格单元格后,QtableView 中的某些单元格不会自动重绘

如何在 QTableView 单元格角落绘制三角形以显示可以从列表中选择的模型数据?

Qt C++ 从 QTableView 中获取选定行的每个单元格的数据

QT QTableview QItemDelegate 简单使用

在 Qtableview 上设置具有颜色(红色/绿色/黄色)的特定单元格