当前位置: 首页 > news >正文

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

复制和粘贴

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

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

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

QTextEdit::keyPressEvent(e);

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

代码:

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

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

相关文章:

  • 深度估计 双目深度估计+单目深度估计 ONNX运行程序
  • Express 路由
  • 2022蓝帽杯初赛电子取证
  • 数据结构与算法复习:第三十六弹
  • CSS - 响应式布局(一)媒体查询
  • 【JAVA预备】课程目录
  • 2022年0902Maven的依赖学习<第四课>
  • Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
  • Vue模板语法(01)
  • 世界第一台通用计算机:ENIAC
  • JAVA学习----HashSet类
  • 文章组合生成-免费文章组合生成软件
  • 华为面试应该怎么准备?
  • JDBC如何记忆
  • C语言之预处理
  • [ JavaScript ] 数据结构与算法 —— 链表
  • __proto__ 和 prototype的关系
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 11111111
  • android 一些 utils
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • centos安装java运行环境jdk+tomcat
  • es6--symbol
  • ES6语法详解(一)
  • Java精华积累:初学者都应该搞懂的问题
  • Linux链接文件
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • windows-nginx-https-本地配置
  • 大主子表关联的性能优化方法
  • 代理模式
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 记一次删除Git记录中的大文件的过程
  • 排序算法之--选择排序
  • 推荐一个React的管理后台框架
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • C# - 为值类型重定义相等性
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #《AI中文版》V3 第 1 章 概述
  • #Linux(帮助手册)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)JAVA使用POI操作excel
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)【Hibernate总结系列】使用举例
  • (转)mysql使用Navicat 导出和导入数据库
  • ***利用Ms05002溢出找“肉鸡