假设我有一个自定义小部件并将其添加到qt。的主窗口中。
如您所见,红色区域是自定义小部件。我想要做的是当鼠标在红色区域被按下并移动时,整个窗口也会移动。
我知道如何简单地实施mousePressEvent
和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);
}
如果您想知道我为什么要这样做,在我的应用程序中,我隐藏了标题栏并自己画了一个自定义标题栏。但窗口不可移动,所以我想在按下鼠标并在标题栏上移动时使整个窗口可移动。
希望我能清楚地解释清楚。
答案 0 :(得分:2)
要从任何窗口小部件移动窗口,必须能够访问窗口,为此我们使用返回顶层的方法window()
,不必分隔坐标{{1和} x()
,以下代码实现了解决方案:
<强> customwidget.h 强>
y()
<强> customwidget.cpp 强>
#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
答案 1 :(得分:1)
如果您使用的是Windows,可以使用它:
#include "mywidget.h"
#include <windows.h>
#include <QWindow>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
}
MyWidget::~MyWidget()
{
}
void MyWidget::mousePressEvent(QMouseEvent* event)
{
if (event->buttons().testFlag(Qt::LeftButton))
{
HWND hWnd = ::GetAncestor((HWND)(window()->windowHandle()->winId()), GA_ROOT);
POINT pt;
::GetCursorPos(&pt);
::ReleaseCapture();
::SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, POINTTOPOINTS(pt));
}
}
答案 2 :(得分:0)
select c.*
from ppi_cd c
where c.posted_date = (
select max(c1.posted_date) from ppi_cd c1 where c1.patient_no = c.patient_no
)
我已经在我的github项目https://github.com/VinuRajaKumar/AVR-HEX-Viewer中实现了以上内容,其中QLabel用作窗口的TitleBar。