cqyczj 发表于 2023-7-9 05:57:39

怎样在QVBoxLayout布局里获得部件的位置信息

怎样在QVBoxLayout布局里获得部件的位置信息?我用 findChildren 无法获得布局里的部件!为空

bluelace25 发表于 2023-7-28 13:38:59

在`QVBoxLayout`布局中,可以使用`itemAt()`方法来获取布局中指定索引处的部件(`QLayoutItem`),然后通过`geometry()`方法获取该部件的位置信息。
首先,确保在布局中正确添加了部件。如果使用`addWidget()`方法将部件添加到`QVBoxLayout`中,那么它们会被正确地管理。
接下来,可以通过以下方法来获取布局中部件的位置信息:

QVBoxLayout* layout = new QVBoxLayout(); // QVBoxLayout 实例
int index = 0; // 想要获取位置信息的部件在布局中的索引

if (index >= 0 && index < layout->count()) {
    QLayoutItem* item = layout->itemAt(index);
    if (item) {
      // 获取部件的位置信息
      QRect itemGeometry = item->geometry();
      int x = itemGeometry.x();
      int y = itemGeometry.y();
      int width = itemGeometry.width();
      int height = itemGeometry.height();

      // 现在可以使用 x、y、width 和 height 变量,来得到部件的位置和大小信息
    }
}

确保`index`的范围在布局中存在的有效部件索引之内(即0到`layout->count() - 1`之间)。如果`index`超出范围,`itemAt()`将返回`nullptr`,因此需要先检查返回值是否有效。
如果部件是通过`addWidget()`添加到布局中的,那么`QVBoxLayout`会自动管理这些部件的位置和大小,无需手动计算它们的位置。这段代码仅适用于在布局中添加部件后,如果希望手动设置或获取特定部件的位置,可以使用`itemAt()`和`geometry()`方法。
如果在使用`findChildren`时遇到问题,可能是因为`findChildren`方法默认只查找子对象,而不会查找布局管理器中的部件。在布局中,部件实际上不是窗口的子对象,而是布局管理器的子对象。如果想使用`findChildren`来查找布局管理器中的部件,可以通过以下方式来实现:

QList<QWidget*> widgets = layout->widget()->findChildren<QWidget*>();

这里,`layout->widget()`将返回与`QVBoxLayout`关联的父部件,然后可以使用`findChildren`来查找这个父部件下的所有`QWidget`子对象,包括在`QVBoxLayout`中的部件。

MarioZz 发表于 2023-8-9 19:23:58

直接获取小部件的Geomtry即可
页: [1]
查看完整版本: 怎样在QVBoxLayout布局里获得部件的位置信息