Я создаю макет отслеживания столбцов, который наследуется от 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, и она не учитывает прокрутку, которая является моей проблемой.
как получить абсолютную позицию заголовка раздела в табличном виде?
В конце концов я вошел в источник Qt для их события рисования, предполагая, что им понадобится фактическая позиция для него, и они используют sectionViewportPosition()
, который дает фактическую позицию сечения относительно верхнего левого угла QTableWidget / QTableView.
Вы можете использовать это вместе с mapToGlobal()
чтобы получить глобальное горизонтальное положение раздела.
Других решений пока нет …