获取表头部分的绝对/全局位置,同时考虑水平滚动

时间:2016-09-11 08:01:54

标签: c++ qt scroll qheaderview

我正在创建一个继承自QHBoxLayout的列跟踪布局,它会将几行编辑对齐到表列:

enter image description here

为此,我使用以下代码计算ColumnAlignedLayout::setGeometry()中每个部分大小的绝对屏幕位置:

void ColumnAlignedLayout::setGeometry(const QRect &r)
{
    QHBoxLayout::setGeometry(r);
    int widgetX = parentWidget()->mapToGlobal(QPoint(0, 0)).x();
    int headerX = headerView->mapToGlobal(QPoint(0, 0)).x();
    int delta = headerX - widgetX;
    for (int ii = 0; ii < headerView->count(); ++ii) {
        int pos = headerView->sectionPosition(ii);
        int size = headerView->sectionSize(ii);

        auto item = itemAt(ii);
        auto r = item->geometry();
        r.setLeft(pos + delta);
        r.setWidth(size);
        item->setGeometry(r);
    }
}

布局已经有效,除非表格有水平滚动。

enter image description here

完整项目位于https://github.com/sashoalm/ColumnAlignedLayout,运行它会轻松重现问题 - 只需放大列直到水平滚动条出现,然后滚动直到隐藏第一列。

无论表格是否已调整大小,

headerView->mapToGlobal(QPoint(0, 0)).x();都会给出相同的值。

我发现了一个类似的问题,但它是针对目标C的,并且它没有考虑滚动这是我的问题。

how to get the absolute position of a section header in tableview?

1 个答案:

答案 0 :(得分:0)

最终我进入Qt的源代码进行绘制事件,假设他们需要实际位置,他们使用List<Integer>,它给出了相对于QTableWidget / QTableView左上角的实际剖面位置。

您可以将其与sectionViewportPosition()一起使用以获取该部分的全局水平位置。