我正在创建一个继承自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的,并且它没有考虑滚动这是我的问题。
how to get the absolute position of a section header in tableview?
答案 0 :(得分:0)
最终我进入Qt的源代码进行绘制事件,假设他们需要实际位置,他们使用List<Integer>
,它给出了相对于QTableWidget / QTableView左上角的实际剖面位置。
您可以将其与sectionViewportPosition()
一起使用以获取该部分的全局水平位置。