Qt 事件父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中,移动A,如何使得窗口D一直在窗口C上方
时间: 2023-07-19 21:03:44 浏览: 80
可以通过重载 `QWidget::moveEvent()` 方法来实现。在父窗口 A 移动时,通过 `QLabel::mapToGlobal()` 方法获取子窗口 D 在屏幕上的坐标,然后再通过 `QLabel::mapFromGlobal()` 方法将其转换为相对于子窗口 C 的坐标,最后通过 `QWidget::move()` 方法将子窗口 D 移动到正确的位置上。
下面是一个示例代码:
```cpp
class MyLabel : public QLabel {
public:
MyLabel(QWidget* parent) : QLabel(parent) {
m_childWindow = new QWidget(this);
m_childWindow->setFixedSize(100, 100);
m_childWindow->setStyleSheet("background-color: red;");
}
protected:
void moveEvent(QMoveEvent* event) override {
if (m_childWindow) {
QPoint globalPos = m_childWindow->mapToGlobal(QPoint(0, 0));
QPoint localPos = mapFromGlobal(globalPos);
m_childWindow->move(localPos.x(), localPos.y() - m_childWindow->height());
}
QLabel::moveEvent(event);
}
private:
QWidget* m_childWindow;
};
```
在上面的代码中,我们创建了一个自定义的 QLabel 子类 MyLabel,它包含了一个名为 m_childWindow 的子窗口。在 MyLabel 的 `moveEvent()` 方法中,我们首先调用父类 QLabel 的 `moveEvent()` 方法,然后通过 `m_childWindow->mapToGlobal(QPoint(0, 0))` 获取子窗口 D 在屏幕上的坐标,并将其转换为相对于 MyLabel 的坐标。最后,我们通过 `m_childWindow->move()` 方法将子窗口 D 移动到正确的位置上。
阅读全文