Qt 父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中有指针窗口D的指针,不可以在窗口A,窗口B中操作C和D,移动A时,如何使得窗口D一直在窗口C上方? 此问题中如果仅重写resizeEvent事件,当A移动时,D并不会跟着移动。有什么方式能解决。不可以通过重写A的moveEvent事件实现,不可以通过重写QLabel C的paintEvent事件实现
时间: 2023-08-15 16:04:49 浏览: 111
可以通过在窗口A的resizeEvent事件中实时计算窗口D的相对位置,然后调用D的move函数来实现。具体步骤如下:
1. 在窗口A的构造函数中,将窗口D的指针传递给窗口B中的QLabel C,即将D设置为C的一个子控件。
2. 在窗口A的resizeEvent事件中,计算窗口D相对于窗口C的位置,并调用D的move函数将其移动到正确的位置。
代码示例:
```
void MainWindow::resizeEvent(QResizeEvent *event)
{
// 调用父类的resizeEvent函数
QMainWindow::resizeEvent(event);
// 获取窗口C的位置和大小
QRect cRect = ui->tabWidget->geometry();
// 将窗口C的位置转换为窗口A的坐标系
QPoint cPos = ui->tabWidget->mapToParent(QPoint(0, 0));
cRect.moveTo(cPos);
// 获取窗口D的位置和大小
QRect dRect = ui->label->geometry();
// 将窗口D的位置转换为窗口B的坐标系
QPoint dPos = ui->label->mapToParent(QPoint(0, 0));
dRect.moveTo(dPos);
// 将窗口D的位置转换为窗口A的坐标系
dPos = ui->label->mapToParent(dPos);
dPos = ui->tabWidget->mapToParent(dPos);
// 计算窗口D相对于窗口C的位置
QPoint relativePos = dPos - cPos;
// 将窗口D移动到正确的位置
ui->label->move(cPos.x() + cRect.width() / 2 - dRect.width() / 2,
cPos.y() + cRect.height() - relativePos.y() - dRect.height());
}
```
在这个示例中,窗口D的位置是通过计算它相对于窗口C的位置,并将它移动到窗口C的底部中央来实现的。如果需要根据具体情况调整窗口D的位置,可以根据实际需求进行修改。
阅读全文