Qt 事件父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中有指针窗口D的指针,不可以在A,B中有D的指针,移动A时,如何使得窗口D一直在窗口C上方?在这种情况下,C为QWidget和C为QLabel 处理有什么不同呢
时间: 2023-10-02 14:13:05 浏览: 33
对于QWidget和QLabel,处理方式是相同的,可以通过重写QLabel或QWidget的resizeEvent函数,在该函数中重新计算窗口D的位置,使其一直在C的上方。
具体实现方法如下:
1. 在QLabel或QWidget的子类中重写resizeEvent函数。
2. 在resizeEvent函数中,获取C的位置和大小,然后根据需要设置窗口D的位置,例如可以将D的位置设置为C的左上角,偏移一定的距离。
代码示例:
```
void MyLabel::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
// 获取C的位置和大小
QRect cRect = C->geometry();
// 计算D的位置
int dX = cRect.x() + 10;
int dY = cRect.y() - D->height() - 10;
// 设置D的位置
D->move(dX, dY);
}
```
注意:窗口D需要在构造函数中设置为无父窗口,否则会随着A或B的移动而移动。同时,窗口D的指针需要由C或其他对象持有,不可以在A或B中持有,否则也会随着A或B的移动而移动。
相关问题
Qt 事件父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中,移动A,如何使得窗口D一直在窗口C上方
可以通过重载 `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 移动到正确的位置上。
Qt 事件父窗口A移动,A中有QTabWidget对象 B ,B中有 一个QLabel C,窗口D 无父窗口且只在C中有指针窗口D的指针,不可以在A,B中有D的指针,移动A时,如何使得窗口D一直在窗口C上方?
可以通过在 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 的上方。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![csv](https://img-home.csdnimg.cn/images/20210720083646.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)