Qt 父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中有指针窗口D的指针,不可以在窗口A,窗口B中操作C和D,移动A时,如何使得窗口D一直在窗口C上方? 此问题中如果仅重写resizeEvent事件,当A移动时,D并不会跟着移动。有什么方式能解决。不可以可以通过重写A的moveEvent事件
时间: 2023-09-20 08:07:04 浏览: 56
qtabwidget-dragging-tabs:Qt 5 QTabWidget,其中将选项卡拖动到新窗口并像在浏览器中一样向后拖动
可以通过重写A的moveEvent事件实现窗口D一直在窗口C上方,具体步骤如下:
1. 在窗口A的构造函数中,将窗口D设置为C的子窗口,即设置D的父窗口为C。
2. 重写A的moveEvent事件,在该事件中计算窗口D相对于窗口C的位置,然后通过设置D的位置实现D一直在C上方。
示例代码:
```cpp
// 在A的构造函数中将D设置为C的子窗口
A::A(QWidget *parent)
: QWidget(parent)
{
QTabWidget *tabWidget = new QTabWidget(this);
QLabel *label = new QLabel(tabWidget);
tabWidget->addTab(label, "B");
QLabel *d = new QLabel(tabWidget);
d->setText("D");
d->setFixedSize(50, 20);
d->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
d->setAttribute(Qt::WA_TransparentForMouseEvents);
d->move(label->width() - d->width(), 0); // 初始化D的位置在C的右上角
d->show();
label->setStyleSheet("background-color: white;");
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(tabWidget);
setLayout(layout);
}
// 重写A的moveEvent事件
void A::moveEvent(QMoveEvent *event)
{
// 获取窗口C的位置
QPoint cPos = mapToGlobal(tabWidget()->currentWidget()->pos());
QPoint cTopLeft = mapToGlobal(tabWidget()->currentWidget()->rect().topLeft());
cPos.setY(cTopLeft.y() - 1); // 微调位置,使D与C之间没有空隙
// 计算窗口D相对于窗口C的位置
QPoint dPos = cPos + tabWidget()->currentWidget()->rect().topRight() - d->rect().topLeft();
// 设置窗口D的位置
d->move(dPos);
QWidget::moveEvent(event);
}
```
通过上述方法,即可实现窗口D一直在窗口C上方,并且随着窗口A的移动而移动。
阅读全文