Qt 鼠标左键推拽界面

这篇具有很好参考价值的文章主要介绍了Qt 鼠标左键推拽界面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

直接重写mouse的事件

代码实现:
button 返回 哪个按钮造成了此事件,buttons 返回 发生此事件时哪些按钮还处于按下状态

#include <QMouseEvent>

private:
	    // 记录坐标差值
    QPoint diff;
    QPoint now_pos;
    bool m_MouseDrag = false; // 一定要记得初始化为false

void Dialog::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton) {
    	m_MouseDrag = true;
                      // 鼠标在全局的位置     // 界面左上角在全局的位置
        this->diff = event->globalPos() - this->frameGeometry().topLeft();
        // 如果是通过界面里的某个部件,进行拖拽移动,获取界面左上角在全局的位置是比较麻烦的
        // 需要用其父类来获取,直接调用parent()函数得到是Object类型,没有frameGeometry成员函数
        // 需要强转为父类 ((QWidget *)this->parent())->frameGeometry.topLeft()
        // 这里只是以父类为 QWidget 为例
        return;
    }
    QDialog::mousePressEvent(event);
}

void Dialog::mouseMoveEvent(QMouseEvent *event)
{
    if(m_MouseDrag && event->buttons() == Qt::LeftButton) {
        QPoint now_pos = event->globalPos() - this->diff;
        this->move(now_pos);
        return;
    }
    QDialog::mouseMoveEvent(event);
}

void Dialog::mouseReleaseEvent(QMouseEvent *event)
{
    // 释放鼠标事件(左键)
    if(event->button() == Qt::LeftButton){
        m_MouseDrag = false;
        return;
    }
    QDialog::mouseReleaseEvent(event);
}

实现一个类

appinitdrag.h

#include <QObject>
#include <QMutex>
#include <QApplication>
#include <QWidget>
#include <QMouseEvent>

class AppInitDrag : public QObject
{
    Q_OBJECT
public:
    AppInitDrag();
    static AppInitDrag* GetInstance();
    void start();

protected:
    bool eventFilter(QObject *obj, QEvent *event);

private:
    static AppInitDrag *self;
};

appinitdrag.cpp

#include "appinitdrag.h"

AppInitDrag::AppInitDrag()
{

}
AppInitDrag *AppInitDrag::self = 0;
AppInitDrag *AppInitDrag::GetInstance()
{// 双重检查锁定机制(Double-Checked Locking)的单例模式
    if(self == nullptr) {
        // 避免多个线程同时通过锁定和创建实例
        QMutex mutex; // 用于实现互斥锁, 确保多线程环境下对 self 的访问是安全的
// QMutexLocker 是Qt提供的辅助类,它简化了对QMutex的使用,通过在其初始化时自动锁定和解锁互斥锁
        QMutexLocker locker(&mutex); // RAII 风格的锁定对象,能确保只有一个线程能够持有 mutex
        if(self == nullptr) {
            // 在锁定的情况下再次检查 self 是否为 nullptr,以防止多个线程同时通过第一次检查
            self = new AppInitDrag;
        }
    }
    return self;
}

void AppInitDrag::start()
{
/*
QApplication(通常简写为qApp)是Qt框架中的一个核心类,用于管理应用程序的控制流和全局设置。
它是Qt应用程序的主要入口点,并提供了一些基本的应用程序功能,包括事件处理、国际化支持、应用程序广播以及整个应用程序的全局设置
*/
//将 this 注册为事件过滤器,从而捕捉特定的鼠标事件
    qApp->installEventFilter(this); // 安装事件过滤器
}

// 使得具有 canMove 属性的 QWidget 窗口能够通过鼠标左键拖动来移动的功能
bool AppInitDrag::eventFilter(QObject *obj, QEvent *event)
{
    QWidget *w = (QWidget *)obj;
    if (!w->property("canMove").toBool()) {
        return QObject::eventFilter(obj, event);
    }

    static QPoint mousePoint;
    static bool mousePressed = false;

    QMouseEvent *mevent = static_cast<QMouseEvent *>(event);
    if (mevent->type() == QEvent::MouseButtonPress) {
        if (mevent->button() == Qt::LeftButton) {
            mousePressed = true;
            mousePoint = mevent->globalPos() - w->pos();
            return true;
        }
    } else if (mevent->type() == QEvent::MouseButtonRelease) {
        mousePressed = false;
        return true;
    } else if (mevent->type() == QEvent::MouseMove) {
        if (mousePressed && mevent->buttons() == Qt::LeftButton) {
            w->move(mevent->globalPos() - mousePoint);
            return true;
        }
    }

    return QObject::eventFilter(obj, event);
}

main.cpp 里添加 appinitdrag.h,然后在要设定拖拽的 widget 窗口的构造函数里添加代码文章来源地址https://www.toymoban.com/news/detail-765959.html

    this->setProperty("canMove", true); // 设置可以拖拽的属性
    this->setWindowFlags(Qt::FramelessWindowHint); // 设置无边窗

到了这里,关于Qt 鼠标左键推拽界面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 我要使用的功能比较简单,主要包含扫描串口、打开串口、发送数据、接收数据、暂停按钮、停止按钮,因此接下里将围绕这几个功能依次更新。 我的工程项目名字叫 “GUI”。

    2024年02月11日
    浏览(57)
  • 【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面。 使用 C++ 语言,配合 Qt 开发串口通信界面,在添加 Widget 做

    2024年02月11日
    浏览(40)
  • Qt:界面实时响应鼠标拖动绘制

    采用双缓冲实现界面实时响应鼠标的拖动绘制。 思想如下:首先需要两张画布pix和tempPix,他们都是QPixmap实例;pix用来保存初始界面或上一阶段以完成的绘制;tempPix用来作为鼠标拖动时的实时界面绘制;当鼠标左键按下后拖动时每次都将将pix赋值给tempPix,然后用tempPix进行绘

    2024年02月11日
    浏览(27)
  • 【Visual Studio】报错 ASSERT: “i >= 0 && i < size()“,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面。 使用 C++ 语言,配合 Qt 开发串口通信界面,在调试动态绘图

    2024年02月11日
    浏览(41)
  • PyQt5下界面设计, 无边框加阴影界面, 鼠标左键移动事件

            本人小白, 网罗各个网页与资源学习总结的内容, 设置界面无边框且留有阴影, 且鼠标左键可以拖动界面的方法.         首先我们寻找一个模板进行学习演示, 例如腾讯会议的界面:         本人会仿照这个界面进行演示说明, 包括各种样式(你看到就是赚到)      

    2023年04月09日
    浏览(33)
  • Qt开发-鼠标事件

    个人认为,事件机制是Qt最难以理解且最为精妙的一部分。事件主要分为两种: 在与用户交互时发生 。比如按下鼠标(mousePressEvent),敲击键盘(keyPressEvent)等。 系统自动发生 ,比如计时器事件(timerEvent)等。 在发生事件时(比如说上面说的按下鼠标),就会产生一个

    2024年02月09日
    浏览(33)
  • QT界面开发杂记(五)

    QString转char* c_str()没有‘\\0’结尾可能导致一些错误可以使用以下方法解决: QString xmlPath = \\\"path\\\"; const char cXmlName[1024] = {0}; memcpy((void*)cXmlName,xmlPath.toStdString().c_str(),xmlPath.size()); char*转QString  

    2024年02月04日
    浏览(34)
  • 使用Qt开发一个登录界面

    在许多应用程序中,我们需要提供一个登录界面来让用户输入用户名和密码,并验证其身份。在本文中,我们将介绍如何使用Qt创建一个简单的登录界面,并演示如何获取用户输入和执行身份验证操作。 首先,我们需要创建一个QWidget部件,并设置其布局为垂直布局。然后,我

    2024年02月13日
    浏览(31)
  • 【Qt设计开发】GUI界面设计开发

      本文是我在学习QT的GUI界面设计过程当中的心得和学习笔记,在学习时已经有C, C++,Python的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。此外,博主还有另外几篇文章,分别关于 Python基础知识 、 Python的具体应用 、 C语言指针结构体

    2024年02月02日
    浏览(38)
  • qt图形化界面开发DAY4

    2024年01月23日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包