Qt 已知 在一个窗口A , 如何 在A上方附着一个窗口透明窗口B,B非A的子窗口,在B上绘制矩形C,且鼠标点击矩形边可以编辑 矩形C的大小位置。透明窗口B要一直可以随着窗口A移动
时间: 2024-06-08 22:09:53 浏览: 116
实现这个功能,你可以使用以下步骤:
1. 创建一个透明窗口B并设置其父窗口为窗口A(这可以确保B随着A的移动而移动),并将B设置为无边框窗口。
2. 在B上绘制矩形C,你可以使用 QPainter 类库来进行绘制。
3. 在B上监听鼠标事件,例如 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent,以便能够捕获用户对矩形C的编辑操作。
4. 在鼠标事件中,你可以使用 QRect 类来计算矩形C的位置和大小,并在需要时重新绘制矩形C。
5. 最后,确保在窗口A移动时,透明窗口B也会移动到正确的位置。
以下是一个简单的示例代码,可以帮助你更好地理解这个过程:
```cpp
#include <QtWidgets>
class TransparentWidget : public QWidget
{
public:
TransparentWidget(QWidget *parent = nullptr)
: QWidget(parent, Qt::FramelessWindowHint | Qt::WindowTransparentForInput)
{
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_MouseNoMask);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_TransparentForMouseEvents);
}
protected:
void mousePressEvent(QMouseEvent *event) override
{
if (rect().adjusted(10, 10, -10, -10).contains(event->pos())) {
m_isDragging = true;
m_dragStartPos = event->pos();
m_dragStartRect = geometry();
event->accept();
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (m_isDragging) {
QPoint delta = event->pos() - m_dragStartPos;
QRect newRect = m_dragStartRect.translated(delta);
setGeometry(newRect);
event->accept();
}
}
void mouseReleaseEvent(QMouseEvent *event) override
{
if (m_isDragging) {
m_isDragging = false;
event->accept();
}
}
void paintEvent(QPaintEvent *event) override
{
QPainter painter(this);
painter.fillRect(rect(), QColor(0, 0, 0, 0));
painter.setPen(QPen(QColor(255, 255, 255, 128), 2));
painter.drawRect(rect().adjusted(10, 10, -10, -10));
}
private:
bool m_isDragging = false;
QPoint m_dragStartPos;
QRect m_dragStartRect;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget mainWindow;
mainWindow.setGeometry(100, 100, 400, 300);
TransparentWidget transparentWidget(&mainWindow);
transparentWidget.setGeometry(50, 50, 200, 150);
transparentWidget.show();
mainWindow.show();
return app.exec();
}
```
这个代码创建了一个带有透明矩形的透明窗口,可以通过鼠标拖动窗口来移动矩形。请注意,我们使用了一些 QWidget 的属性来实现透明和无边框窗口。
阅读全文