QClipboard 剪贴板

来源:互联网 发布:吸烟有害健康烟盒 知乎 编辑:程序博客网 时间:2024/06/18 09:01

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

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

[cpp] view plain copy
  1. QClipboard *clipboard = QApplication::clipboard();  
  2. QString originalText = clipboard->text();  
  3. ...  
  4. 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.   
  6.     if (mimeData->hasImage()) {  
  7.         setPixmap(qvariant_cast<QPixmap>(mimeData->imageData()));  
  8.     } else if (mimeData->hasHtml()) {  
  9.         setText(mimeData->html());  
  10.         setTextFormat(Qt::RichText);  
  11.     } else if (mimeData->hasText()) {  
  12.         setText(mimeData->text());  
  13.         setTextFormat(Qt::PlainText);  
  14.     } else {  
  15.         setText(tr("Cannot display data"));  
  16.     }  


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

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

要实现的功能也很简单,就是使用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. //粘贴文本  
  15. void Widget::on_TextPaste_clicked()  
  16. {  
  17.     QClipboard *clipboard = QApplication::clipboard();  
  18.     if(clipboard->text().isEmpty())  
  19.     {  
  20.         QMessageBox::information(this"提示""剪贴板不存在文本内容");  
  21.         return;  
  22.     }  
  23.     ui->DestEdit->setText(clipboard->text());  
  24. }  
文本的拷贝比较简单,只需在拷贝时将输入框中的文本内容设置到应用程序的剪贴板即可;粘贴时,从应用程序的剪贴板中取出文本即可。

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

[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. //粘贴图片  
  16. void Widget::on_PicPaste_clicked()  
  17. {  
  18.     QClipboard *clipboard = QApplication::clipboard();  
  19.     if(clipboard->pixmap().isNull())  
  20.     {  
  21.         QMessageBox::information(this"提示""剪贴板不存在图片");  
  22.         return;  
  23.     }  
  24.     ui->DestPic->setScaledContents(true);  
  25.     ui->DestPic->setPixmap(clipboard->pixmap());  
  26. }  
由于,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. //粘贴颜色  
  14. void Widget::on_ColorPaste_clicked()  
  15. {  
  16.     QClipboard *clipboard = QApplication::clipboard();  
  17.     const QMimeData *data = clipboard->mimeData();  
  18.     if(data->hasColor())  
  19.     {  
  20.         QColor c = qvariant_cast<QColor>(data->colorData());  
  21.         QPalette p = ui->DestColor->palette();  
  22.         p.setColor(QPalette::Background, c);  
  23.         ui->DestColor->setAutoFillBackground(true);  
  24.         ui->DestColor->setPalette(p);  
  25.     }  
  26.     else  
  27.     {  
  28.         QMessageBox::information(this"提示""剪贴板不存在颜色");  
  29.     }  
  30. }  
至于颜色的拷贝时,我们先借助于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.   
  16. //粘贴HTML  
  17. void Widget::on_HtmlPaste_clicked()  
  18. {  
  19.     QClipboard *clipboard = QApplication::clipboard();  
  20.     const QMimeData *data = clipboard->mimeData();  
  21.     if(data->hasHtml())  
  22.     {  
  23.         ui->DestHtml->setText(data->html());  
  24.     }  
  25.     else  
  26.     {  
  27.         QMessageBox::information(this"提示""剪贴板不存在HTML");  
  28.     }  
  29. }  

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

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



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

原创粉丝点击