QClipboard 剪贴板

迈不过友情╰ 2022-06-03 01:14 322阅读 0赞

在Qt中,我们可以使用QClipboard类来访问窗口系统的剪贴板对象。剪贴板为我们在不同的应用间拷贝粘贴数据提供了一种简单的机制。并且,其所支持的数据类型和Qt中的拖放操作所支持的类型相同。

另外,在QApplication类中,还为我们提供了一个静态方法clipboard(),我们可以使用该方法来获得应用程序的全局剪贴板对象。例如,

[cpp] view plain copy

  1. QClipboard *clipboard = QApplication::clipboard();
  2. QString originalText = clipboard->text();
  3. clipboard->setText(newText);

QClipboard类为我们在应用程序间传递简单的数据类型提供了一些便利的方法,如setText()可以用来传递Unicode字符串,setPixmap()和setImage()可以用来传递图片。更复杂的数据类型,则要借助于QMimeData类来完成。

这些函数的典型使用方式如下:

[cpp] view plain copy

  1. void DropArea::paste()
  2. {
  3. const QClipboard *clipboard = QApplication::clipboard();
  4. const QMimeData *mimeData = clipboard->mimeData();
  5. if (mimeData->hasImage()) {
  6. setPixmap(qvariant_cast(mimeData->imageData()));
  7. } else if (mimeData->hasHtml()) {
  8. setText(mimeData->html());
  9. setTextFormat(Qt::RichText);
  10. } else if (mimeData->hasText()) {
  11. setText(mimeData->text());
  12. setTextFormat(Qt::PlainText);
  13. } else {
  14. setText(tr(“Cannot display data”));
  15. }

下面,我们就以一个简单的实例,来实际使用一下这几个函数。

新建一个GUI程序,简单设计界面如下:

Center

要实现的功能也很简单,就是使用QClipboard来将源控件中的内容拷贝到目的控件中。

先来看文本的拷贝与粘贴,代码实现如下:

[cpp] view plain copy

  1. //文本拷贝
  2. void Widget::on_TextCopy_clicked()
  3. {
  4. if(ui->SrcEdit->text().isEmpty())
  5. {
  6. QMessageBox::information(this, “警告”, “请先输入文本”);
  7. return;
  8. }
  9. QClipboard *clipboard = QApplication::clipboard();
  10. clipboard->setText(ui->SrcEdit->text());
  11. QMessageBox::information(this, “提示”, “拷贝成功”);
  12. }
  13. //粘贴文本
  14. void Widget::on_TextPaste_clicked()
  15. {
  16. QClipboard *clipboard = QApplication::clipboard();
  17. if(clipboard->text().isEmpty())
  18. {
  19. QMessageBox::information(this, “提示”, “剪贴板不存在文本内容”);
  20. return;
  21. }
  22. ui->DestEdit->setText(clipboard->text());
  23. }

文本的拷贝比较简单,只需在拷贝时将输入框中的文本内容设置到应用程序的剪贴板即可;粘贴时,从应用程序的剪贴板中取出文本即可。

下面来看图片的拷贝与粘贴,代码如下:

[cpp] view plain copy

  1. //拷贝图片
  2. void Widget::on_PicCopy_clicked()
  3. {
  4. QClipboard *clipboard = QApplication::clipboard();
  5. const QPixmap *pixmap = ui->SrcPic->pixmap();
  6. if(pixmap == nullptr)
  7. {
  8. QMessageBox::information(this, “提示”, “请先设置源图像”);
  9. return;
  10. }
  11. clipboard->setPixmap(*(ui->SrcPic->pixmap()));
  12. QMessageBox::information(this, “提示”, “拷贝成功”);
  13. }
  14. //粘贴图片
  15. void Widget::on_PicPaste_clicked()
  16. {
  17. QClipboard *clipboard = QApplication::clipboard();
  18. if(clipboard->pixmap().isNull())
  19. {
  20. QMessageBox::information(this, “提示”, “剪贴板不存在图片”);
  21. return;
  22. }
  23. ui->DestPic->setScaledContents(true);
  24. ui->DestPic->setPixmap(clipboard->pixmap());
  25. }

由于,QClipboard直接提供了setPixmap()和setImage()函数,直接支持了对图片的操作,所以拷贝图片和文本一样,都可以使用该类直接进行完成。

再来看颜色的拷贝和粘贴,代码如下:

[cpp] view plain copy

  1. //拷贝颜色
  2. void Widget::on_ColorCopy_clicked()
  3. {
  4. QPalette p = ui->SrcColor->palette();
  5. QColor color = p.color(QPalette::Background);
  6. QMimeData *data = new QMimeData();
  7. data->setColorData(color);
  8. QClipboard *clibboard = QApplication::clipboard();
  9. clibboard->setMimeData(data);
  10. QMessageBox::information(this, “提示”, “拷贝成功”);
  11. }
  12. //粘贴颜色
  13. void Widget::on_ColorPaste_clicked()
  14. {
  15. QClipboard *clipboard = QApplication::clipboard();
  16. const QMimeData *data = clipboard->mimeData();
  17. if(data->hasColor())
  18. {
  19. QColor c = qvariant_cast(data->colorData());
  20. QPalette p = ui->DestColor->palette();
  21. p.setColor(QPalette::Background, c);
  22. ui->DestColor->setAutoFillBackground(true);
  23. ui->DestColor->setPalette(p);
  24. }
  25. else
  26. {
  27. QMessageBox::information(this, “提示”, “剪贴板不存在颜色”);
  28. }
  29. }

至于颜色的拷贝时,我们先借助于QPalette类,来取到源QLabel的背景色,然后使用QMimeData类将其存储到应用程序的剪贴板中。同样,在粘贴时,也是要借助QMimeData类来完成,并且,因为QColor不属于Qt中的基本类型,所以不存在toXXX()之类的函数,我们必须借助于qvariant_cast()或QVariant::value()方法来完成具体的类型转换。最后,同样是使用QPalette来完成对目的label背景色的改变。注意,必须先调用setAutoFillBackground(true)方法,setPalette()才会生效。

最后,来看一下HTML文本的拷贝与粘贴,代码如下:

[cpp] view plain copy

  1. //拷贝HTML
  2. void Widget::on_HtmlCopy_clicked()
  3. {
  4. if(ui->SrcHtml->text().isEmpty())
  5. {
  6. QMessageBox::information(this, “提示”, “请先设置内容”);
  7. return;
  8. }
  9. QClipboard *clipboard = QApplication::clipboard();
  10. QMimeData *data = new QMimeData;
  11. data->setHtml(ui->SrcHtml->text());
  12. clipboard->setMimeData(data);
  13. QMessageBox::information(this, “提示”, “拷贝成功”);
  14. }
  15. //粘贴HTML
  16. void Widget::on_HtmlPaste_clicked()
  17. {
  18. QClipboard *clipboard = QApplication::clipboard();
  19. const QMimeData *data = clipboard->mimeData();
  20. if(data->hasHtml())
  21. {
  22. ui->DestHtml->setText(data->html());
  23. }
  24. else
  25. {
  26. QMessageBox::information(this, “提示”, “剪贴板不存在HTML”);
  27. }
  28. }

可见,HTML文本的拷贝与粘贴和上面将的QColor类似,均是借助于QMimeData类来实现的。在此就不详细解释了。

当然,这个例子中,只涉及到了普通文本,图片,颜色,HTML文本的拷贝于粘贴。至于Qt中的其他数据类型,使用方法基本类似;至于自定义数据类型,只需子类化QMimeData类型即可。

http://blog.csdn.net/amnes1a/article/details/70739183

发表评论

表情:
评论列表 (有 0 条评论,322人围观)

还没有评论,来说两句吧...

相关阅读

    相关 进程通信——剪贴板

    进程通信——剪贴板 一、简介 1.1 定义 剪贴板是由操作系统维护的一块内存区域,这块内存区域不属于任何单独的进程,但是每一个进程又都可以访问这块内存区域,而

    相关 QClipboard 剪贴板

    在Qt中,我们可以使用QClipboard类来访问窗口系统的剪贴板对象。剪贴板为我们在不同的应用间拷贝粘贴数据提供了一种简单的机制。并且,其所支持的数据类型和Qt中的拖放操作所

    相关 javascript 复制到剪贴板

    > 前言: > >        想实现一个点击复制事件,但是以前没有进行过相关操作.找了一些资料,多数是过时 或者 写的看不懂的.于是自己搞懂了之后在此分享自己的成果.