【问题标题】:How to move window using custom titleBar in Qt如何在 Qt 中使用自定义标题栏移动窗口
【发布时间】:2018-02-25 15:06:41
【问题描述】:

我是 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 上按下鼠标来移动窗口。

【问题讨论】:

  • QLable 是来自 QWidget 的驱动类,您可以安装事件或从自定义类和 mouseMoveEvent 代码中执行 Qlabel 类
  • 我提供的可行解决方案在stackoverflow.com/a/60659234/10060901中给出

标签: c++ qt window mouseevent move


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

    我建议你使用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.提出的问题的示例项目

    【讨论】:

    • 它可以正常工作,但是在鼠标按下时,窗口正在跳跃……你能解决这个问题吗?
    • @ManishPrajapati 我使用 QLabel 位置修复了它。
    • @ManishPrajapati 如果我的回答对您有帮助,请接受或投票,谢谢。
    • 你从github下载新版本了吗?它对我有用。按下标签移动而不跳跃。
    • 是的,我已经尝试过您的项目,并且运行良好,但不适用于我的项目...
    【解决方案3】:

    我知道这有点晚了,但我解决了这个问题。该代码与 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);
    

    【讨论】:

    • 欢迎来到 Stack Overflow。 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释此代码的作用以及它如何解决问题,以便对其他有类似问题的用户有用。
    • @FluffyKitten 谢谢,你是对的!那里我放了更多的解释!
    • 好多了 :) 这使它成为一个很好的答案!
    猜你喜欢
    • 2022-11-04
    • 1970-01-01
    • 2011-07-27
    • 2021-04-08
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2010-12-12
    相关资源
    最近更新 更多