QClipboard 剪贴板

来源:互联网 发布:大智慧大数据终端破解 编辑:程序博客网 时间:2024/06/06 08:43

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

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

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

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

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

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


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

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

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

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

//文本拷贝void Widget::on_TextCopy_clicked(){    if(ui->SrcEdit->text().isEmpty())    {        QMessageBox::information(this, "警告", "请先输入文本");        return;    }    QClipboard *clipboard = QApplication::clipboard();    clipboard->setText(ui->SrcEdit->text());    QMessageBox::information(this, "提示", "拷贝成功");}//粘贴文本void Widget::on_TextPaste_clicked(){    QClipboard *clipboard = QApplication::clipboard();    if(clipboard->text().isEmpty())    {        QMessageBox::information(this, "提示", "剪贴板不存在文本内容");        return;    }    ui->DestEdit->setText(clipboard->text());}
文本的拷贝比较简单,只需在拷贝时将输入框中的文本内容设置到应用程序的剪贴板即可;粘贴时,从应用程序的剪贴板中取出文本即可。

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

//拷贝图片void Widget::on_PicCopy_clicked(){    QClipboard *clipboard = QApplication::clipboard();    const QPixmap *pixmap = ui->SrcPic->pixmap();    if(pixmap == nullptr)    {        QMessageBox::information(this, "提示", "请先设置源图像");        return;    }    clipboard->setPixmap(*(ui->SrcPic->pixmap()));    QMessageBox::information(this, "提示", "拷贝成功");}//粘贴图片void Widget::on_PicPaste_clicked(){    QClipboard *clipboard = QApplication::clipboard();    if(clipboard->pixmap().isNull())    {        QMessageBox::information(this, "提示", "剪贴板不存在图片");        return;    }    ui->DestPic->setScaledContents(true);    ui->DestPic->setPixmap(clipboard->pixmap());}
由于,QClipboard直接提供了setPixmap()和setImage()函数,直接支持了对图片的操作,所以拷贝图片和文本一样,都可以使用该类直接进行完成。

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

//拷贝颜色void Widget::on_ColorCopy_clicked(){    QPalette p = ui->SrcColor->palette();    QColor color = p.color(QPalette::Background);    QMimeData *data = new QMimeData();    data->setColorData(color);    QClipboard *clibboard = QApplication::clipboard();    clibboard->setMimeData(data);    QMessageBox::information(this, "提示", "拷贝成功");}//粘贴颜色void Widget::on_ColorPaste_clicked(){    QClipboard *clipboard = QApplication::clipboard();    const QMimeData *data = clipboard->mimeData();    if(data->hasColor())    {        QColor c = qvariant_cast<QColor>(data->colorData());        QPalette p = ui->DestColor->palette();        p.setColor(QPalette::Background, c);        ui->DestColor->setAutoFillBackground(true);        ui->DestColor->setPalette(p);    }    else    {        QMessageBox::information(this, "提示", "剪贴板不存在颜色");    }}
至于颜色的拷贝时,我们先借助于QPalette类,来取到源QLabel的背景色,然后使用QMimeData类将其存储到应用程序的剪贴板中。同样,在粘贴时,也是要借助QMimeData类来完成,并且,因为QColor不属于Qt中的基本类型,所以不存在toXXX()之类的函数,我们必须借助于qvariant_cast()或QVariant::value()方法来完成具体的类型转换。最后,同样是使用QPalette来完成对目的label背景色的改变。注意,必须先调用setAutoFillBackground(true)方法,setPalette()才会生效。

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

//拷贝HTMLvoid Widget::on_HtmlCopy_clicked(){    if(ui->SrcHtml->text().isEmpty())    {        QMessageBox::information(this, "提示", "请先设置内容");        return;    }    QClipboard *clipboard = QApplication::clipboard();    QMimeData *data = new QMimeData;    data->setHtml(ui->SrcHtml->text());    clipboard->setMimeData(data);    QMessageBox::information(this, "提示", "拷贝成功");}//粘贴HTMLvoid Widget::on_HtmlPaste_clicked(){    QClipboard *clipboard = QApplication::clipboard();    const QMimeData *data = clipboard->mimeData();    if(data->hasHtml())    {        ui->DestHtml->setText(data->html());    }    else    {        QMessageBox::information(this, "提示", "剪贴板不存在HTML");    }}

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

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




0 0