• qt自定义控件之TextEdit


    前言

    在日常使用qt的时候,因为是windows桌面应用,所以会产生许多交互。拖动就是就是一个比较常见的交互。
    比如我要拖动一份文件到qtextedit。但是发现拖进去之后,只显示一个路径。
    而我需要实现效果如下:
    1.当拖入图片的时候,显示图片
    2.当我拖入文件的时候,读取文件(目前只实现读取txt文本)
    3.从磁盘内复制的图片或文件,使用ctrl+v能将图片或文件添加到textedit

    拖入

    这个首先需要实现鼠标拖动事件。及dropEvent,我们需要重写这个方法
    QDropEvent可以获取到我们拖入的文件路径。定义一个qfileinfo来进行判断文件类型。
    当为图片文件则,进行插入图片,文件类型则导入文本
    如下为实习代码:

    if(e->mimeData()->hasUrls())
        {
            QList<QUrl> list = e->mimeData()->urls();
            for(int i = 0; i < list.count(); i++)
            {
                QString strPath=list[i].toLocalFile();
                QFileInfo info(strPath);
                QStringList imageTypeList;
                imageTypeList<<"png"<<"jpg"<<"gif"<<"jepg"<<"xpm";
                if(imageTypeList.contains(info.suffix()))
                {
                    this->textCursor().insertImage(list[i].toLocalFile());
                }
                if(info.suffix()=="txt")
                {
                    QFile file(strPath);
                    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
                    {
                        continue;
                    }
                    while (!file.atEnd()) {
                        QString strLine=file.readLine();
                        this->append(strLine);
                    }
                    file.close();
    
                }
            }
        }
        else
        {
            e->ignore();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    复制和粘贴

    这个需要用到键盘事件。keypressevent。
    判断当前键盘事件是否为组合键 ctrl+v

    if(e->modifiers()==(Qt::ControlModifier)&&e->key()==Qt::Key_V)
    
    • 1

    然后就是获取剪贴板的内容。若剪贴板有内容,导入的方式和拖入是一样的。这里需要注意的是。当不为组合键的时候,一定要加一句

    QTextEdit::keyPressEvent(e);
    
    • 1

    若不加这句话,其他的键盘操作都会失效。比如说退格不能删除文字

    代码:

     if(e->modifiers()==(Qt::ControlModifier)&&e->key()==Qt::Key_V)
        {
            QClipboard *clipboard = QApplication::clipboard();
            const QMimeData *mimeData = clipboard->mimeData();  //死值
            QList<QUrl> list = mimeData->urls();
            for(int i = 0; i < list.count(); i++)
            {
                QString strPath=list[i].toLocalFile();
                QFileInfo info(strPath);
                QStringList imageTypeList;
                imageTypeList<<"png"<<"jpg"<<"gif"<<"jepg"<<"xpm";
                if(imageTypeList.contains(info.suffix()))
                {
                    this->textCursor().insertImage(list[i].toLocalFile());
                }
                if(info.suffix()=="txt")
                {
                    QFile file(strPath);
                    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
                    {
                        continue;
                    }
                    while (!file.atEnd()) {
                        QString strLine=file.readLine();
                        this->append(strLine);
                    }
                    file.close();
    
                }
            }
        }
        else
        {
            QTextEdit::keyPressEvent(e);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    看下实现效果怎么样:
    在这里插入图片描述

  • 相关阅读:
    Docker - 卷 - 数据持久化
    直播课堂系统,打造出超过线下培训场景200%的在线学习课堂
    【动态规划】- 概述 + js 求解爬楼梯问题
    全面认识redux应用
    STL技巧大赏
    AD教程系列 | 5 - 绘制原理图
    小白C语言基础详解:函数
    Pinia(四)了解和使用getters
    【设计模式】Java设计模式 - 模板模式
    数学公式识别
  • 原文地址:https://blog.csdn.net/weixin_43676892/article/details/126669666