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-09-20 07:07:04 浏览: 147
可以通过重写A的eventFilter函数来实现窗口D跟随窗口C移动的效果。具体实现步骤如下:
1. 在A的构造函数中,安装事件过滤器:
```cpp
A::A(QWidget* parent)
: QWidget(parent)
{
// ...
installEventFilter(this); // 安装事件过滤器
}
```
2. 在A中重写eventFilter函数:
```cpp
bool A::eventFilter(QObject* obj, QEvent* event)
{
if (obj == qTabWidget && event->type() == QEvent::Resize) {
// 当QTabWidget大小变化时,更新窗口D的位置
QPoint cPos = qTabWidget->mapToGlobal(qLabel->pos()); // 获取QLabel在屏幕上的位置
d->move(cPos.x(), cPos.y() - d->height()); // 将窗口D移动到QLabel上方
}
return QWidget::eventFilter(obj, event);
}
```
3. 在A的析构函数中,卸载事件过滤器:
```cpp
A::~A()
{
removeEventFilter(this); // 卸载事件过滤器
}
```
这样,当窗口A移动或大小变化时,QTabWidget会发出Resize事件,触发A的eventFilter函数,在该函数中更新窗口D的位置,使其一直在窗口C上方。
阅读全文
相关推荐












