QClipboard 剪貼板

在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文本的拷貝與粘貼,代碼如下:

//拷貝HTML
void 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, "提示", "拷貝成功");
}

//粘貼HTML
void 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類型即可。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章