Как переместить все окно, когда мышь находится на пользовательском виджете окна в Qt? - PullRequest
0 голосов
/ 11 июня 2018

Допустим, у меня есть собственный виджет и я добавляю его в главное окно в qt.

enter image description here

Как видите,красная область - это пользовательский виджет.Что я хочу сделать, так это то, что когда мышь нажимается в красной области и перемещается, все окно также перемещается.

Я знаю, как просто реализовать 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);
}

Если вы удивляетесь, почему я хочу это сделать, в своем приложении я спрятал строку заголовка и нарисовал пользовательскийстрока заголовка сама.Но окно не является подвижным, поэтому я хочу сделать все окно подвижным, когда мышь нажата и перемещена в строке заголовка.
Надеюсь, я все объяснил ясно.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Если вы работаете в 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));
    }
}
0 голосов
/ 11 июня 2018

Чтобы переместить окно из любого виджета, необходимо иметь возможность доступа к окну, и для этого мы используем метод window(), который возвращает верхний уровень, не нужно разделять координаты x() и y(), следующий код реализует решение:

customwidget.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

customwidget.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);
}
...