Qt 父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中有指针窗口D的指针,不可以在窗口A,窗口B中操作C和D,移动A时,如何使得窗口D一直在窗口C上方? 此问题中如果仅重写resizeEvent事件,当A移动时,D并不会跟着移动。有什么方式能解决。不可以通过重写A的moveEvent事件
时间: 2023-07-19 22:03:45 浏览: 130
可以通过重写QLabel C的paintEvent事件来实现。在paintEvent事件中调用窗口D的move函数,使得窗口D一直在窗口C上方。
具体实现步骤如下:
1. 在QLabel C的构造函数中创建窗口D,并设置窗口D的位置。
2. 重写QLabel C的paintEvent事件,在该事件中调用窗口D的move函数,重新设置窗口D的位置,使得窗口D一直在窗口C上方。
以下是示例代码:
```
class MyLabel : public QLabel {
public:
MyLabel(QWidget *parent = nullptr) : QLabel(parent) {
// 创建窗口D,并设置位置
m_windowD = new QWidget(nullptr);
m_windowD->setFixedSize(50, 50);
m_windowD->setStyleSheet("background-color: red;");
m_windowD->move(0, -m_windowD->height());
// 设置标签C的样式
setStyleSheet("background-color: green;");
// 设置标签C的大小策略,使其填满父窗口
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}
protected:
void paintEvent(QPaintEvent *event) override {
// 调用基类的paintEvent事件
QLabel::paintEvent(event);
// 重新设置窗口D的位置
QPoint pos = mapToGlobal(QPoint(0, 0));
m_windowD->move(pos.x(), pos.y() - m_windowD->height());
}
private:
QWidget *m_windowD;
};
```
在父窗口A中,将QTabWidget对象B添加到父窗口A中,并将标签C添加到QTabWidget对象B中,如下所示:
```
QTabWidget *tabWidget = new QTabWidget(this);
MyLabel *labelC = new MyLabel(tabWidget);
tabWidget->addTab(labelC, "Tab");
```
这样,当父窗口A移动时,标签C的paintEvent事件会被触发,从而重新设置窗口D的位置,使得窗口D始终在标签C上方。
阅读全文