Получить абсолютную / глобальную позицию раздела заголовка таблицы с учетом горизонтальной прокрутки

Я создаю макет отслеживания столбцов, который наследуется от QHBoxLayout, который выровняет пару правок строк по столбцам таблицы:

Для этого я рассчитываю абсолютную позицию экрана каждого размера раздела в 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);
    }
}

Макет уже работает, за исключением случаев, когда таблица имеет горизонтальную прокрутку.

Полный проект находится по адресу https://github.com/sashoalm/ColumnAlignedLayout, и его запуск позволит легко воспроизвести проблему - просто увеличьте столбцы, пока не появится горизонтальная полоса прокрутки, а затем прокрутите, пока первый столбец не будет скрыт.

headerView->mapToGlobal(QPoint(0, 0)).x(); дает одинаковое значение независимо от того, был ли размер таблицы изменен или нет.

Я нашел похожий вопрос, но он касается цели C, и она не учитывает прокрутку, которая является моей проблемой.

как получить абсолютную позицию заголовка раздела в табличном виде?

1 ответ

В конце концов я вошел в источник Qt для их события рисования, предполагая, что им понадобится фактическая позиция для него, и они используют sectionViewportPosition(), который дает фактическую позицию сечения относительно верхнего левого угла QTableWidget/QTableView.

Вы можете использовать это вместе с mapToGlobal() чтобы получить глобальное горизонтальное положение раздела.

Другие вопросы по тегам