Qt 事件父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中有指针窗口D的指针,不可以在窗口A,窗口B中操作C和D,移动A时,如何使得窗口D一直在窗口C上方? 如果仅重写resizeEvent事件,当A移动时,D并不会跟着移动
时间: 2023-07-19 16:03:45 浏览: 73
Qt 子窗口父窗口切换,窗口间传值
可以重写窗口A的moveEvent事件,实现移动窗口D的功能。具体实现方法如下:
1. 在窗口A的构造函数中,将窗口D的指针传递给窗口B中的QLabel C,可以通过QLabel的setUserData函数来实现。
2. 在窗口A中重写moveEvent事件,获取窗口A的位置和大小,计算出窗口D需要移动的位置,然后调用窗口D的move函数实现移动。
下面是示例代码:
```cpp
// 在窗口A的构造函数中传递窗口D的指针给窗口B中的QLabel C
MyWindowA::MyWindowA(QWidget *parent) : QWidget(parent)
{
// 创建窗口D
m_windowD = new MyWindowD(this);
// 将窗口D的指针传递给窗口B中的QLabel C
ui->tabWidget->widget(0)->findChild<QLabel*>("labelC")->setUserData(0, m_windowD);
}
// 重写窗口A的moveEvent事件
void MyWindowA::moveEvent(QMoveEvent *event)
{
// 调用父类的moveEvent函数
QWidget::moveEvent(event);
// 获取窗口A的位置和大小
QPoint posA = this->pos();
QSize sizeA = this->size();
// 获取窗口D的指针
MyWindowD *windowD = m_windowD;
// 如果窗口D的指针为空,则不进行任何操作
if (windowD == nullptr) {
return;
}
// 获取窗口C的位置和大小
QWidget *widgetC = ui->tabWidget->widget(0)->findChild<QWidget*>("widgetC");
QPoint posC = widgetC->pos();
QSize sizeC = widgetC->size();
// 计算出窗口D需要移动的位置
QPoint posD(posC.x() + (sizeC.width() - windowD->width()) / 2,
posC.y() - windowD->height());
// 调用窗口D的move函数实现移动
windowD->move(posD);
}
```
需要注意的是,如果窗口D的指针为空,则不进行任何操作。此外,还需要确保窗口D一开始是在窗口C的上方,可以在窗口D的构造函数中设置初始位置。
阅读全文