写点什么

QT 读取剪切板内容 - 实现复制粘贴文本和图片

作者:DS小龙哥
  • 2022 年 3 月 20 日
  • 本文字数:1553 字

    阅读完需:约 5 分钟

1. 前言

很多软件都支持从剪切板里粘贴图片、文字数据到指定位置,比如:QQ、WeiXin 可以直接从剪切板粘贴图片、文字进行发送消息。这个功能 QT 里实现也很方便,接口 QT 都提供了。


来至 QT 帮助文档的介绍:


QClipboard 类提供对窗口系统剪贴板的访问,剪贴板提供了在应用程序之间复制和粘贴数据的简单机制,QClipboard 支持与 QDrag 相同的数据类型,并使用类似的机制。QClipboard *clipboard = QGuiApplication::clipboard();QString originalText = clipboard->text();...clipboard->setText(newText);

QClipboard 提供了一些方便的函数来访问常见的数据类型:setText()允许交换 Unicode 文本,setPixmap()和 setImage()允许在应用程序之间交换 Qpixmap 和 QImages。setMimeData()函数具有极大的灵活性:它允许将任何 QMimeData 添加到剪贴板中。每种类型都有相应的 getter,例如 text()、image()和 pixmap()。可以通过调用 clear()清除剪贴板。使用这些功能的典型示例如下:

void DropArea::paste(){const QClipboard *clipboard = QApplication::clipboard();const QMimeData *mimeData = clipboard->mimeData();

if (mimeData->hasImage()) {setPixmap(qvariant_cast<QPixmap>(mimeData->imageData()));} else if (mimeData->hasHtml()) {setText(mimeData->html());setTextFormat(Qt::RichText);} else if (mimeData->hasText()) {setText(mimeData->text());setTextFormat(Qt::PlainText);} else {setText(tr("Cannot display data"));}}

macOS 用户须知 macOS 支持一个单独的查找缓冲区,在查找操作中保存当前的搜索字符串。可以通过指定 FindBuffer 模式来访问此查找剪贴板。

Windows 和 macOS 用户须知 Windows 和 macOS 不支持全局鼠标选择;它们只支持全局剪贴板,也就是说,它们只在进行显式复制或剪切时向剪贴板添加文本。Windows 和 macOS 没有所有权的概念;剪贴板是一个完全全局的资源,因此所有应用程序都会收到更改通知。

通用 Windows 平台用户须知通用 Windows 平台仅允许在应用程序处于活动状态且应用程序窗口具有焦点时查询剪贴板。在后台访问剪贴板数据将因访问拒绝而失败。


使用剪切板功能需要加入的头文件:


#include <QClipboard>#include <QApplication>#include <QMimeData>
复制代码



2. 实现代码

2.1 从剪切板获取图片

从剪切板里获取图片,转为 QImage,然后在窗口上绘制出来,效果上面图片里贴了。


//粘贴图片void Widget::on_pushButton_4_clicked(){    QClipboard *clipboard = QApplication::clipboard();    const QMimeData *mimeData = clipboard->mimeData();    if (mimeData->hasImage())    {        //将图片数据转为QImage        QImage img = qvariant_cast<QImage>(mimeData->imageData());        if(!img.isNull())        {           //绘制显示图片           ui->widget->SetImage(img);        }    }}
复制代码

2.2 给剪切板设置图片

将软件内的图片赋值给剪切板,方便粘贴到其他地方。


//复制图片void Widget::on_pushButton_3_clicked(){    QString filename=QFileDialog::getOpenFileName(this,"选择图片","C:/",tr("*.bmp *.jpg *.png"));    //filename==选择文件的绝对路径
if(!filename.isEmpty()) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setImage(QImage(filename)); }}
复制代码

2.3 从剪切板获取文本

void Widget::on_pushButton_2_clicked(){    QClipboard *clipboard = QApplication::clipboard();    QString text=clipboard->text();    ui->plainTextEdit->setPlainText(text);}
复制代码

2.4 给剪切板设置文本

void Widget::on_pushButton_clicked(){    QClipboard *clipboard = QApplication::clipboard();    clipboard->setText("hello,我是QT复制到剪切板的文本.");}
复制代码


发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
QT读取剪切板内容-实现复制粘贴文本和图片_3月月更_DS小龙哥_InfoQ写作平台