如何在 Qt 中使用自定义 titleBar 移动 window

How to move window using custom titleBar in Qt

我是 Qt 初学者,我想使用我自己的自定义 titleBar(QLabel) 进行拖动和移动Window。

Qt代码:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    mpos = event->pos();
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) 
    {
        QPoint diff = event->pos() - mpos;
        QPoint newpos = this->pos() + diff;
        this->move(newpos);
    }
}

此代码允许我通过在任何 QWidget 上按下鼠标来移动 window,但我想通过在 QLabel 上按下鼠标来移动 window。

您可以重新实现 QLabel class 和 impalement mousePressEvent

示例:

头文件

#ifndef MYLABLE_H

#define MYLABLE_H

#include <QEvent>
#include <QObject>
#include <QLabel>

class MyLable : public QLabel
{
    Q_OBJECT
public:
    explicit MyLable(QWidget *parent = 0);

    QPoint mpos;

signals:

public slots:



    // QWidget interface
protected:
    void mousePressEvent(QMouseEvent *);
};

#endif // MYLABLE_H

.cpp

#include "mylable.h"

#include <QMouseEvent>

MyLable::MyLable(QWidget *parent) : QLabel(parent)
{
}

void MyLable::mousePressEvent(QMouseEvent * event)
{
    if (event->buttons() & Qt::LeftButton)
    {
        QPoint diff = event->pos() - mpos;
        QPoint newpos = this->pos() + diff;
        this-> parentWidget()->move(newpos);
    }
}

我建议您使用 eventFilter 获取事件 MousePressMouseRelease:

void MainApp::mousePressEvent(QMouseEvent *event)
{
    current = event->pos();
}

void MainApp::mouseMoveEvent(QMouseEvent *event)
{
    if(pressed)
        this->move(mapToParent(event->pos() - current));
}

bool MainApp::eventFilter(QObject *object, QEvent *event)
{
    if (object == ui->label && event->type() == QEvent::MouseButtonPress)
    {
        pressed = true;
        return true;
    }
    if (object == ui->label && event->type() == QEvent::MouseButtonRelease)
    {
        pressed = false;
        return true;
    }
    else
        return false;
}

这是您在 github download here.

上提出的问题的示例项目

我知道有点晚了,但我解决了这个问题。该代码与 Farhad 建议的实现非常相似,但要解决“跳跃”window,您还需要在事件过滤器中更新鼠标的当前位置:

 if (object == ui->frame_title && event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent* mouseEvent = (QMouseEvent*)event;
            if (pressed == false){
                current = mouseEvent->pos();
            }
            pressed = true;
            return true;
        }

添加这个,当用户第一次按下 left-click 时,你会得到当前的鼠标位置。

完整的实现如下:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    current = event->pos();
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{

    if(pressed)
        this->move(mapToParent(event->pos() - current));
}

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (object == ui->frame_title && event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent* mouseEvent = (QMouseEvent*)event;
        if (pressed == false){
            current = mouseEvent->pos();
        }
        pressed = true;
        return true;
    }
    if (object == ui->frame_title && event->type() == QEvent::MouseButtonRelease)
    {
        pressed = false;
        return true;
    }
    else
        return false;
}

然后在您的构造函数中,只需添加(frame_title 是我的标题栏):

ui->frame_title->installEventFilter(this);