Qt 事件父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中有指针窗口D的指针,不可以在A,B中有D的指针,移动A时,如何使得窗口D一直在窗口C上方?
时间: 2023-07-19 15:03:44 浏览: 70
可以通过在 A 中重写 `moveEvent` 事件,在其中计算窗口 D 在窗口 C 上方的位置,并将其移动到相应位置。具体实现可以按照以下步骤进行:
1. 在 A 的头文件中声明一个指向窗口 D 对象的指针:
```c++
class A : public QWidget
{
Q_OBJECT
public:
explicit A(QWidget *parent = nullptr);
~A();
protected:
void moveEvent(QMoveEvent *event) override;
private:
QLabel *m_labelC;
QWidget *m_windowD;
};
```
2. 在 A 的构造函数中初始化指向窗口 D 对象的指针:
```c++
A::A(QWidget *parent) : QWidget(parent)
{
m_labelC = new QLabel("Label C");
m_windowD = new QWidget(m_labelC);
m_windowD->setFixedSize(50, 50);
m_windowD->setStyleSheet("background-color: red;");
}
```
3. 在 A 的 `moveEvent` 事件中计算窗口 D 在窗口 C 上方的位置,并将其移动到相应位置:
```c++
void A::moveEvent(QMoveEvent *event)
{
// 获取窗口 C 的位置和大小
QRect rectC = m_labelC->geometry();
// 计算窗口 D 在窗口 C 上方的位置
QPoint posD(rectC.x(), rectC.y() - m_windowD->height());
// 将窗口 D 移动到相应位置
m_windowD->move(posD);
}
```
这样,在 A 移动时,窗口 D 将一直保持在窗口 C 的上方。
阅读全文