Qt 拖动事件

文章目录

  • [1 自定义控件 TextEdit](#1 自定义控件 TextEdit)
  • [2 实现打开文件功能](#2 实现打开文件功能)
  • [3 实现鼠标滚轮放大字体](#3 实现鼠标滚轮放大字体)

QEvent::DragEnter

当拖动文件进入到窗口/控件中时,触发该事件,它对应的子类是QDragEnterEvent

QEvent::DragLeave

当拖动文件离开窗口/控件时,触发该事件,它对应的子类是QDragLeaveEvent

QEvent::DragMove

当拖动文件在窗口/控件中移动时,触发该事件,它对应的子类是QDragMoveEvent

QEvent::Drop

当拖动文件在窗口/控件中移动时,触发该事件,它对应的子类是QDragMoveEvent

1 自定义控件 TextEdit

自定义一个标签控件TextEditx,让它继承自QTextEdit,然后重写拖放相关的函数。

添加自定义控件类TextEditX ,在 texteditx.h 文件中

c++ 复制代码
// TextEditX.h
protected:
    // 重写父类的方法
    void dragEnterEvent(QDragEnterEvent *e);
    void dragMoveEvent(QDragMoveEvent *e);
    void dragLeaveEvent(QDragLeaveEvent *e);
    void dropEvent(QDropEvent *e);

在texteditx.cpp 文件中

c++ 复制代码
// TextEditX.cpp
TextEditX::TextEditX(QWidget *parent) : QTextEdit{parent} {
    // 部件将接受鼠标拖放事件
    this->setAcceptDrops(true);
}

void TextEditX::dragEnterEvent(QDragEnterEvent *e) {
    qDebug() << "dragEnterEvent";
    // 默认情况下,窗口部件不接受拖动
    e->acceptProposedAction();
}

void TextEditX::dragMoveEvent(QDragMoveEvent *e) {
    qDebug() << "dragMoveEvent";
}

void TextEditX::dragLeaveEvent(QDragLeaveEvent *e) {
    qDebug() << "dragLeaveEvent";
}

void TextEditX::dropEvent(QDropEvent *e) {
    qDebug() << "dropEvent";
}

2 实现打开文件功能

在texteditx.cpp文件中

c++ 复制代码
// texteditx.cpp
void TextEditX::dropEvent(QDropEvent *e) {
    qDebug() << "dropEvent";
    QList<QUrl> urls = e->mimeData()->urls();
    if (urls.isEmpty()) {
        return;
    }
    // 获取这个文件名
    QString fileName = urls.first().toLocalFile();
    qDebug() << urls.first() << "\n" << fileName;

    // 打开文件
    QFile file(fileName);

    // 打开失败返回 false
    if (file.open(QIODevice::ReadOnly)) {
        setPlainText(file.readAll());
    }
}

3 实现鼠标滚轮放大字体

在 texteditx.h 文件中

c++ 复制代码
protected:
    // 重写滚轮事件
    void wheelEvent(QWheelEvent *e);

在 texteditx.cpp 文件中

c++ 复制代码
void TextEditX::wheelEvent(QWheelEvent *e) {
    if (QApplication::keyboardModifiers() == Qt::ControlModifier) {
        if (e->angleDelta().y() > 0) {
            // 滚轮远离使用者, 进行放大
            this->zoomIn();
        } else {
            // 滚轮靠近使用者, 进行缩小
            this->zoomOut();
        }
    } else {
        // 调用父类的实现, 否则无法实现文本的上下滚动
        QTextEdit::wheelEvent(e);
    }
}
相关推荐
jimy112 分钟前
c++的 Type Traits (二、更详细版本)
开发语言·c++
狗凯之家源码网27 分钟前
纯 PHP+MySQL 应用市场系统源码实测!
开发语言·mysql·php
dishugj38 分钟前
系统架构风险点、敏感点和权衡点的概念和区分
java·开发语言
geovindu1 小时前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模
马优晨1 小时前
JAVA 中 VO 实体类是什么意思,为什么要做这个
java·开发语言·状态模式·java vo·java vo是什么
Aurorar0rua1 小时前
CS50 x 2024 Notes Python - 01
开发语言·python·学习方法
茉莉玫瑰花茶2 小时前
GO [ 标准库 ]
开发语言·后端·golang
半杯咖啡半行码2 小时前
C++11核心特性详解:从C++11到C++20 的现代C++指南
开发语言·c++
2601_966949653 小时前
如何判断实时行情数据是否已经更新?从时间戳、交易时段到行情有效性
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
All for pursuit.3 小时前
【位运算-3】136.只出现一次的数字
数据结构·c++·算法·leetcode