Qt 已知 在一个窗口A , 如何 在A上方附着一个窗口透明窗口B,在B上绘制矩形C,且鼠标点击矩形边可以编辑 矩形C的大小位置。透明窗口B要一直可以随着窗口A移动
时间: 2024-05-10 14:19:25 浏览: 91
Qt 窗口 无边框化,移动,大小调整
这个需求可以通过以下步骤实现:
1. 创建两个窗口,窗口A和窗口B。窗口B设置为透明,可以使用QMainWindow或QWidget。
2. 在窗口B中重写paintEvent()函数,绘制矩形C。
3. 在窗口B中重写mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent()函数,实现鼠标拖拽矩形C的功能。
4. 在窗口A中创建一个布局,将窗口B放在布局中。使用setGeometry()函数设置窗口B的初始位置。
5. 通过重写窗口A的moveEvent()函数,实现窗口B跟随窗口A移动。
下面是示例代码:
```cpp
// MyWidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QMainWindow>
class MyWidget : public QMainWindow
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
~MyWidget();
protected:
void moveEvent(QMoveEvent *event);
private:
QMainWindow *m_windowB;
};
#endif // MYWIDGET_H
// MyWidget.cpp
#include "MyWidget.h"
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QPainter>
class MyTransparentWidget : public QWidget
{
public:
explicit MyTransparentWidget(QWidget *parent = nullptr)
: QWidget(parent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::WindowTransparentForInput)
{
setAttribute(Qt::WA_TranslucentBackground);
setFixedSize(200, 200);
m_rect = QRect(50, 50, 100, 100);
}
protected:
void paintEvent(QPaintEvent *event) override
{
Q_UNUSED(event);
QPainter painter(this);
painter.setPen(QPen(Qt::red, 2));
painter.drawRect(m_rect);
}
void mousePressEvent(QMouseEvent *event) override
{
m_mousePressPos = event->pos();
m_rectPress = m_rect;
}
void mouseMoveEvent(QMouseEvent *event) override
{
int dx = event->pos().x() - m_mousePressPos.x();
int dy = event->pos().y() - m_mousePressPos.y();
m_rect = m_rectPress.translated(dx, dy);
update();
}
void mouseReleaseEvent(QMouseEvent *event) override
{
Q_UNUSED(event);
}
private:
QRect m_rect;
QPoint m_mousePressPos;
QRect m_rectPress;
};
MyWidget::MyWidget(QWidget *parent)
: QMainWindow(parent)
{
setFixedSize(400, 300);
QVBoxLayout *layout = new QVBoxLayout;
m_windowB = new QMainWindow(this, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
m_windowB->setCentralWidget(new MyTransparentWidget(m_windowB));
layout->addWidget(m_windowB);
setLayout(layout);
m_windowB->setGeometry(0, 0, 200, 200);
}
MyWidget::~MyWidget()
{
}
void MyWidget::moveEvent(QMoveEvent *event)
{
m_windowB->move(event->pos().x(), event->pos().y() - m_windowB->height());
}
```
阅读全文