如何在Qt中使用自定义标题栏移动窗口

问题描述 投票:0回答:4

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

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 上按下鼠标来移动窗口,但我想通过在 QLabel 上按下鼠标来移动窗口。

c++ qt window mouseevent move
4个回答
2
投票

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

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

添加此功能,当用户第一次按左键单击时,您可以获得当前鼠标位置。

这是完整的实现:

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);

1
投票

我建议您使用

eventFilter
来获取事件
MousePress
MouseRelease
:

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 上下载。


1
投票

您可以重新实现QLabel类并刺穿

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

0
投票

这是事件过滤器建议的稍微修改版本,而不是使用

QMouseEvent::globalPos()
:

void MainWindow::mousePressEvent(QMouseEvent* event)
{
    mousePos_ = event->globalPos();
}

void MainWindow::mouseMoveEvent(QMouseEvent* event)
{
    if (!event->buttons().testFlag(Qt::LeftButton))
        return;

    if(moveWindow_)
    {
        move(geometry().topLeft() + event->globalPos() - mousePos_);
        mousePos_ = event->globalPos();
    }
}

bool MainWindow::eventFilter(QObject* object, QEvent* event)
{
    if (object == logo_ &&
        event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent* mouseEvent{ static_cast<QMouseEvent*>(event) };
        if (mouseEvent->buttons().testFlag(Qt::LeftButton))
        {
            mousePos_ = mouseEvent->globalPos();
            moveWindow_ = true;
            return true;
        }
        else
        {
            return false;
        }
    }
    if (object == logo_ && event->type() == QEvent::MouseButtonRelease)
    {
        QMouseEvent* mouseEvent{ static_cast<QMouseEvent*>(event) };
        if (mouseEvent->buttons().testFlag(Qt::LeftButton))
        {
            moveWindow_ = false;
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.