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 17:13:05 浏览: 66
Qt 子窗口父窗口切换,窗口间传值
你可以通过在A中重写eventFilter事件来实现,在A中安装一个事件过滤器,并在事件过滤器中捕获到A的resizeEvent事件,然后将C的位置和大小传递给D,使得D一直在C的上方,代码如下:
```cpp
class EventFilter : public QObject
{
public:
explicit EventFilter(QWidget* parent, QLabel* label, QWidget* window)
: QObject(parent)
, m_label(label)
, m_window(window)
{
// 在父窗口中安装事件过滤器
parent->installEventFilter(this);
}
protected:
bool eventFilter(QObject* watched, QEvent* event) override
{
if (watched == parent() && event->type() == QEvent::Resize) {
// 获取C的位置和大小
QRect rect = m_label->geometry();
rect.moveTo(m_label->mapTo(this->parent(), QPoint(0, 0)));
// 将C的位置和大小传递给D
m_window->setGeometry(rect.x(), rect.y() - m_window->height(), rect.width(), m_window->height());
}
return QObject::eventFilter(watched, event);
}
private:
QLabel* m_label;
QWidget* m_window;
};
```
然后在A的构造函数中创建一个事件过滤器对象:
```cpp
EventFilter* eventFilter = new EventFilter(this, labelC, windowD);
```
这样,当A移动或者改变大小时,D就会一直保持在C的上方。
阅读全文