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事件来实现。不可以在A中操作D
时间: 2023-10-02 22:13:05 浏览: 43
TabWidget.zip
可以通过重写A的eventFilter事件来实现。具体实现步骤如下:
1. 在A的构造函数中为A安装一个事件过滤器:
```cpp
this->installEventFilter(this);
```
2. 重写A的eventFilter事件,在该事件中判断事件类型是否为QEvent::Move,如果是,则获取C的绝对坐标,计算出D应该移动到的位置,然后将D移动到该位置:
```cpp
bool A::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::Move) {
QPoint labelPos = B->mapToGlobal(C->pos()); // 获取C在屏幕上的绝对坐标
QPoint dPos = labelPos - QPoint(0, D->height()); // 计算D应该移动到的位置
D->move(dPos); // 将D移动到该位置
}
return QWidget::eventFilter(watched, event);
}
```
3. 在窗口D显示前,需要先调用一次A的eventFilter事件,以初始化D的位置:
```cpp
A a;
a.show();
a.eventFilter(nullptr, new QEvent(QEvent::Move)); // 初始化D的位置
D d(&a);
d.show();
```
这样,当A移动时,窗口D就会一直在窗口C上方。
阅读全文