简述


QTextEdit控件我这里就不做详细说明,如有需要请查看Qt官方文档。QTextEdit最常用的使用场景就是编辑框。它支持纯文本、富文本的编辑和查看功能比较强大,但我在使用中发现其原生的接口或使用场景有限不能满足开发者自定义的一些操作。因为项目需要做一个类似于即时通讯程序的消息输入控件故采用的QTextEdit这个控件。在使用中也遇到了一些难题在此记录一下我的解决方法和一些心得(大佬们有更好的方法也可以给小弟指点一二,不胜感激)记录在此和大家一下交流。

正文

  1. 从系统桌面拖拽文件或图片到QTextEdit,QTextEdit原生的拖拽文件或图片的操作显示的只是文件或图片的路径,这显然是不符合一个即时通讯工具消息编辑框的风格(参考微信、qq)。所以我们要做得好看一点就必须得自己重新实现这种操作,废话不多说直接上代码,这里文件和图片我是单独处理的

    /*!* \brief 设置文件在编辑框中的图标* \param strPath*/
    void EditDrop::SetEditImage(QString strPath)
    {qDebug()<<"FilePath:"<<strPath;if(strPath.isEmpty())return;if(strPath.length() > 256){QFileInfo fileTempInfo(strPath);qDebug() << QString("拖入文件失败,\"%1\" 文件名或文件源路径大于系统支持的长度,请重命名或更改路径后再试!").arg(fileTempInfo.fileName());QString strError = QString("拖入文件失败,\"%1\" 文件名或文件源路径大于系统支持的长度,请重命名或更改路径后再试!").arg(fileTempInfo.fileName());QMessageBox::information(this->window(), "提示", strError);return;}QFileInfo file(strPath);QHash<QString, QString>::iterator iter = m_hash_Path.find(strPath);if(iter != m_hash_Path.end()){QMessageBox::information(this->window(), "提示", tr("正在待发送中,不能重复发送。"));return;}if(!file.exists()){QMessageBox::information(this->window(), "提示", "该文件不存在,可能被删或被移动,无法发送!");return;}else if(file.isFile()){if(file.size() == 0){QMessageBox::information(this->window(), "提示", tr("%1,该文件为空文件,无法发送,请重新选择。").arg(file.fileName()));return;}if(file.suffix().contains("lnk")){QMessageBox::information(this->window(), "提示", tr("%1,暂不支持发送该类型文件。").arg(file.fileName()));return;}}else{QMessageBox::information(this->window(), "提示", "暂不支持发送文件夹");return;}//m_hash_Path[strPath] = strPath;QString strSize = toalSize(file.size());QFileIconProvider fileicon;QIcon sss = fileicon.icon(file);QPixmap pix = sss.pixmap(100, 100);pix = pix.scaled(35,35, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);QSize size  = pix.size();//    if(size.width() == 0)//        return;//画图片QPixmap pixmap(pix_width, pix_height);pixmap.fill(Qt::transparent);int y = (pix_height - size.height() - rect_spac * 2) / 2;QPainter painter(&pixmap);painter.drawPixmap(pix_spac + rect_spac, y, pix);//画文字QFont font("Microsoft YaHei UI", 10);painter.setFont(font);QFontMetrics fm(font);int t_height = fm.boundingRect(strPath).height();int x = pix_spac * 2 + rect_spac + size.width();QString newFileName = strPath;QFileInfo newFileInfo(newFileName);QString strElidedText = fm.elidedText(newFileInfo.fileName(), Qt::ElideMiddle, 200, Qt::TextShowMnemonic);painter.drawText(QPoint(x, 20), strElidedText);painter.drawText(QPoint(x, 20 + t_height), strSize);//画边框painter.setPen(QPen(QColor("#d0d0d0")));painter.drawRect(rect_spac, rect_spac, pix_width - 3, pix_height - 3);QTextDocument * textDocument = this->document();textDocument->addResource( QTextDocument::ImageResource, strPath, QVariant(pixmap));QTextCursor cursor = this->textCursor();cursor.beginEditBlock();QTextImageFormat imageFormat;imageFormat.setWidth(pixmap.width());imageFormat.setHeight(pixmap.height());imageFormat.setName(strPath);cursor.insertImage(imageFormat);cursor.endEditBlock();
    }

    处理拖拽进来的文件中加入了一些操作习惯的判断,对文件的一些判断具体的代码里面有体现。该方法现在有个已知bug:安装winrar解压软件v5.50版本时文件图标会很小如图:

    如果各位大佬有解决方案,回复小弟一下,不胜感激!

    下面是处理拖拽图片接口

    /*!* \brief 处理拖拽或剪切进来的图片* \param image 图片数据* \param url 图片路径* \return */
    QString EditDrop::SetPixPath(const QImage &image,const QUrl &url)
    {QPixmap pix = QPixmap::fromImage(image);QString TempPath = GetTempScreenFilePath();QString path = TempPath + url.toString() + ".PNG";pix.save(path,nullptr);QUrl pathurl(path);QHash<QString, QString>::iterator iter = m_hash_Path.find(path);if(iter != m_hash_Path.end()){QMessageBox::information(this->window(), "提示", tr("%1,已有该图片。").arg(path));return "";}int width ;int height;width = pix.width(); //获得以前图片的宽和高height = pix.height();int width_im  = width;int height_im = height;if(width > 120)width_im = 120;if(height > 100)height_im = 100;double dvalue = 0.0;if(width > height){dvalue = (double)height / (double)width;height_im = (double)width_im * dvalue;}else{dvalue = (double)width / (double)height;width_im = (double)height_im * dvalue;}if(width_im < 30)width_im = 30;if(height_im < 20)height_im = 20;QPixmap pixmap = pix.scaled(width_im, height_im, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);QImage image_test = pixmap.toImage();document()->addResource(QTextDocument::ImageResource, pathurl, image_test);QTextCursor cursor = this->textCursor();cursor.beginEditBlock();QTextImageFormat imageFormat;imageFormat.setWidth(pixmap.width());imageFormat.setHeight(pixmap.height());imageFormat.setName(path);cursor.insertImage(imageFormat);cursor.endEditBlock();return path;
    }

    效果图:拖拽进来的图片我这里做了个缓存,当在编辑框复制该图片时能找到该图片的路径,图片也做了缩放处理。具体处理方法代码里面有体现。

  2. 即时通讯工具肯定少不了表情之类的功能,QTextEdit原生的功能可以加载并显示表情,但复制粘贴的操作必须要自己重新实现(原生的公能第二次复制粘贴时就只显示路径了)代码如下:

    /*!* \brief 加载表情到编辑框* \param strPath 表情路径*/
    void EditDrop::SetEmojiPath(QString strPath)
    {QPixmap pixmap(strPath);QTextDocument * textDocument = this->document();textDocument->addResource( QTextDocument::ImageResource, strPath, QVariant(pixmap));QTextCursor cursor = this->textCursor();cursor.beginEditBlock();QTextImageFormat imageFormat;imageFormat.setWidth(pixmap.width());imageFormat.setHeight(pixmap.height());imageFormat.setName(strPath);cursor.insertImage(imageFormat);cursor.endEditBlock();m_list_emoji.append(strPath);this->window()->activateWindow();this->setFocus();
    }//测试发现这种添加资源的方法会影响效率,目前还没找到解决办法

    由于篇幅过长请各位大佬移步小弟第二篇文章.....

QTextEdit个人使用心得相关推荐

  1. 【QTdesigner】课时36.使用QTextEdit控件输入多行文本【pyqt5+QTdesigner模式】

    课程目录 一点心得 视频链接 课程重点 代码位置 完整代码 遇到的问题 改写效果展示 改写注意点 改写代码(QTdesigner模式) ** >>> 点击进入:pyqt5专栏< ...

  2. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  3. 测试心得:微图书销售小程序

    测试心得:微图书销售小程序 前言 这个学期差不多也将近结束,经过大半个学期,从项目需求的确认和项目文档的编写,到一步步的设计与实现,现在终于到了测试阶段,但是我们在测试阶段也暴露出了很多bug,但是每 ...

  4. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...

  5. 计算机财务应用实验心得,计算机会计实习心得-20210628124643.doc-原创力文档

    计算机会计实习心得 计算机会计实习心得1 毕业实践环节是大学生在完成全部课程后.走向社会之前最真实的一个模拟实验,对于我们财会专业的学生,平时注意注重理论学习,缺乏实践锻炼,因此实习显得尤为重要.在本 ...

  6. html5考试总结300字,期中考心得300字5

    为了检验学生半个学期所学的知识而进行的一次考试,有利于学生比较正式地检验自己平时的学习水平,根据这个成绩,学生可以及时的调整学习心态和方法,更有效率地进行下一阶段的学习,期中考试主要考察学生前半学期的 ...

  7. Python Qt GUI设计:QLineEdit和QTextEdit文本框类(基础篇—13)

    目录 1.QLineEdit文本框类 2.QTextEdit文本框类 QLineEdit和QTextEdit都是文本框类,QLineEdit类是单行文本框控件,可以输入单行字符串.QTextEdit类 ...

  8. Assembly学习心得

    http://blog.csdn.net/etmonitor/ Assembly学习心得 说明: 最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参 ...

  9. 什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得

    [IT168 专稿]不少朋友已经在不经意间与Windows Server 2008系统进行了亲密接触,在一段时间的接触之后,不知大家对该系统的文件搜索功能会有什么样的体会?其实,Windows Ser ...

最新文章

  1. 解决在SQL Server 2000的存储过程不能调试
  2. AI 落地,数据安全绕不开的 4 大问题
  3. 揭秘仿人机器人背后的技术秘密 | 优必选研究院技术专家刘益彰【附PPT】
  4. 通过Webservice查询手机号码归属地
  5. latex文档基础知识
  6. Oracle+BEA后的ESB
  7. ASP.NET MVC下的四种验证编程方式[续篇]
  8. 7-42 关于堆的判断 (25 分)
  9. 源码剖析 Netty 服务启动 NIO
  10. Asp.net 邮件传输
  11. SSM框架02--mybatis(1)
  12. 完成的定义 Definition of Done
  13. 04-新拟物单选按钮样式
  14. java开发常用chrome插件下载地址,开发者常用的十款Chrome插件
  15. Centos安装显卡驱动
  16. C语言判断关系R是否为自反关系
  17. 职业规划(一)怎么写简历
  18. mysql 5.1 变量专题
  19. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(补1)--gazebo仿真
  20. matlab中的帮助命令

热门文章

  1. Python实现简单版本的人生重开模拟器
  2. 为建筑、土木工程、交通运输、工厂设计、各式的生产
  3. 智能人机交互在电商领域的技术实践 ——阿里小蜜
  4. 支付宝不绑定银行卡可以用淘宝吗?
  5. 计算机毕业设计Java晨曦文学社在线投稿系统的设计与实现(源码+系统+mysql数据库+lw文档)
  6. MFC 加载ICON类型BitMap的方式
  7. 现货白银交易技巧怎么学
  8. visual studio code配置项 settings.json
  9. 【STM32开发】win平台开源工具链开发STM32(二)编译器和下载器
  10. Mac文件怎么恢复?mac废纸篓数据恢复,有效教程在这里