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

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

  • 1
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页
评论

打赏作者

加油吧,小杜

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值