假设我有一个自定义小部件并将其添加到 qt 的主窗口中。
如您所见,红色区域是自定义小部件。我想要做的是,当鼠标在红色区域按下并移动时,整个窗口也会移动。
我知道如何简单地实施mousePressEvent
and mouseMoveEvent
;但是当处理带有自定义小部件的窗口时,我不知道当鼠标在自定义小部件上按下时如何移动整个窗口。
另外我想提一下,我只希望当鼠标在红色区域中按下并移动时窗口可移动,而当鼠标在主窗口区域的其余部分中按下并移动时,不会发生任何事情。
这就是我的CustomWidget
类看起来像:
CustomWidget::CustomWidget(QWidget *parent) : QWidget(parent)
{
setFixedSize(50, 50);
setStyleSheet("QWidget { background: red; }");
}
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter painter(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
}
void CustomWidget::mousePressEvent(QMouseEvent *event)
{
xCoord = event->x();
yCoord = event->y();
}
void CustomWidget::mouseMoveEvent(QMouseEvent *event)
{
move(event->globalX() - xCoord, event->globalY() - yCoord);
}
如果您想知道为什么我要这样做,在我的应用程序中,我隐藏了标题栏并自己绘制了一个自定义标题栏。但是窗口是不可移动的,所以我想在按下鼠标并在标题栏上移动时使整个窗口可移动。
希望我能清楚地解释自己。
要从任何小部件移动窗口,必须能够访问该窗口,为此我们使用该方法window()
返回顶层,不需要分离坐标x()
and y()
,下面的代码实现了解决方案:
自定义widget.h
#ifndef CUSTOMWIDGET_H
#define CUSTOMWIDGET_H
#include <QWidget>
class CustomWidget : public QWidget
{
Q_OBJECT
public:
explicit CustomWidget(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
QPoint startPos;
};
#endif // CUSTOMWIDGET_H
自定义widget.cpp
#include "customwidget.h"
#include <QMouseEvent>
#include <QPainter>
#include <QStyleOption>
CustomWidget::CustomWidget(QWidget *parent) : QWidget(parent)
{
setFixedSize(50, 50);
setStyleSheet("QWidget { background: red; }");
}
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter painter(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
}
void CustomWidget::mousePressEvent(QMouseEvent *event)
{
startPos = event->pos();
QWidget::mousePressEvent(event);
}
void CustomWidget::mouseMoveEvent(QMouseEvent *event)
{
QPoint delta = event->pos() - startPos;
QWidget * w = window();
if(w)
w->move(w->pos() + delta);
QWidget::mouseMoveEvent(event);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)