Qt GUIにおけるQClipboard::mimeData()の解説


QClipboard::mimeData()は、Qt GUIアプリケーションにおいて、システムのクリップボードに格納されているデータを取得するための関数です。クリップボードに格納されているデータは、テキスト、画像、ファイルなど、様々な形式のデータを含むことができます。

使い方

QClipboard::mimeData()関数は、QMimeData型のポインタを返します。QMimeDataオブジェクトは、クリップボードに格納されているデータの形式と内容を管理します。

const QMimeData *clipboardData = QClipboard::mimeData();

QMimeDataオブジェクトから、クリップボードに格納されているデータにアクセスするには、以下のメソッドを使用することができます。

  • urls(): URL形式のデータをQUrlオブジェクトのリストとして取得します。
  • image(): 画像形式のデータをQImageオブジェクトとして取得します。
  • html(): HTML形式のデータを文字列として取得します。
  • text(): テキスト形式のデータを文字列として取得します。
  • data(const QString &mimeType): 指定されたMIMEタイプのデータを取得します。
  • formats(): クリップボードに格納されているデータの形式のリストを取得します。

以下のコードは、クリップボードに格納されているテキストデータをコンソールに出力する例です。

const QMimeData *clipboardData = QClipboard::mimeData();

if (clipboardData && clipboardData->hasFormat("text/plain")) {
  const QByteArray &data = clipboardData->data("text/plain");
  QString text = QString::fromUtf8(data);
  std::cout << text.toStdString() << std::endl;
}

モード

QClipboard::mimeData()関数には、modeという引数を受け取ることができます。この引数は、クリップボードのどの部分からデータを取得するかを指定します。デフォルトのモードはClipboardで、これはグローバルクリップボードからデータを取得します。

  • FindBuffer: 検索バッファからデータを取得します。(macOSのみ)
  • Selection: マウス選択領域からデータを取得します。
  • Clipboard: グローバルクリップボードからデータを取得します。
  • クリップボードに格納されているデータは、他のアプリケーションによって変更される可能性があります。そのため、クリップボードに格納されているデータにアクセスする前に、QClipboard::changed()シグナルに接続することをお勧めします。
  • QClipboard::mimeData()関数は、クリップボードにデータが存在する場合にのみ、有効なポインタを返します。クリップボードにデータが存在しない場合は、nullptrを返します。


#include <QApplication>
#include <QClipboard>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // クリップボードからデータを取得
  const QMimeData *clipboardData = QClipboard::mimeData();

  // テキストデータが存在するかどうかを確認
  if (clipboardData && clipboardData->hasFormat("text/plain")) {
    // テキストデータを取得
    const QByteArray &data = clipboardData->data("text/plain");
    QString text = QString::fromUtf8(data);

    // テキストデータをコンソールに出力
    std::cout << text.toStdString() << std::endl;
  } else {
    std::cout << "クリップボードにテキストデータがありません。" << std::endl;
  }

  return 0;
}

例2:クリップボードに格納されている画像データをQLabelウィジェットに表示する

#include <QApplication>
#include <QClipboard>
#include <QLabel>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // QLabelウィジェットを作成
  QLabel label;

  // クリップボードからデータを取得
  const QMimeData *clipboardData = QClipboard::mimeData();

  // 画像データが存在するかどうかを確認
  if (clipboardData && clipboardData->hasFormat("image/png")) {
    // 画像データを取得
    const QByteArray &data = clipboardData->data("image/png");
    QPixmap pixmap;
    if (pixmap.loadFromData(data)) {
      // 画像データを`QLabel`ウィジェットに設定
      label.setPixmap(pixmap);
      label.show();
    } else {
      std::cout << "クリップボードに画像データを読み込めませんでした。" << std::endl;
    }
  } else {
    std::cout << "クリップボードに画像データがありません。" << std::endl;
  }

  return 0;
}
#include <QApplication>
#include <QClipboard>
#include <QListView>
#include <QModelIndex>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // QListViewウィジェットを作成
  QListView listView;

  // モデルを作成
  QStandardItemModel *model = new QStandardItemModel();

  // クリップボードからデータを取得
  const QMimeData *clipboardData = QClipboard::mimeData();

  // URLデータが存在するかどうかを確認
  if (clipboardData && clipboardData->hasFormat("text/uri-list")) {
    // URLデータを取得
    const QByteArray &data = clipboardData->data("text/uri-list");
    QStringList urls = QString::fromUtf8(data).split("\n");

    // URLデータをモデルに追加
    for (const QString &url : urls) {
      if (url.isEmpty()) {
        continue;
      }

      QStandardItem *item = new QStandardItem(url);
      model->appendRow(item);
    }

    // モデルを`QListView`ウィジェットに設定
    listView.setModel(model);
    listView.show();
  } else {
    std::cout << "クリップボードにURLデータがありません。" << std::endl;
  }

  return 0;
}
  • クリップボードに格納されているHTMLデータをWebブラウザで開く
  • クリップボードに格納されているファイルデータをファイルに保存する


QPlatformClipboardを使用する

QPlatformClipboardクラスは、プラットフォーム固有のクリップボード機能へのアクセスを提供します。QClipboard::mimeData()よりも低レベルなAPIですが、より詳細な制御やプラットフォーム固有の機能へのアクセスが可能になる場合があります。

#include <QPlatformClipboard>

QString getTextFromClipboard() {
  QPlatformClipboard *clipboard = QApplication::platformTheme()->platformClipboard();
  const QMimeData *clipboardData = clipboard->mimeData();

  if (clipboardData && clipboardData->hasFormat("text/plain")) {
    const QByteArray &data = clipboardData->data("text/plain");
    return QString::fromUtf8(data);
  } else {
    return "";
  }
}

システムAPIを使用する

プラットフォームによっては、システムAPIを使用してクリップボードにアクセスすることができます。これは、より高パフォーマンスな方法になる可能性がありますが、プラットフォーム固有のコードが必要になります。

カスタムクリップボードを実装する

アプリケーション固有のクリップボードを実装することもできます。これは、アプリケーション間で共有する必要のないデータや、独自の形式のデータをクリップボードに格納したい場合に役立ちます。

クリップボード監視を使用する

QClipboard::changed()シグナルに接続することで、クリップボードの内容が変更されたときに通知を受け取ることができます。これは、クリップボードの内容が変更されたときに自動的にアクションを実行したい場合に役立ちます。

選択方法

どの代替方法を選択するかは、状況によって異なります。以下の点を考慮する必要があります。

  • コードの複雑さ
    カスタムクリップボードを実装する場合は、コードが複雑になる可能性があることを考慮する必要があります。
  • パフォーマンス
    パフォーマンスが重要な場合は、システムAPIを使用するなどの低レベルな方法を検討する必要があります。
  • プラットフォームのサポート
    選択した代替方法が、使用しているプラットフォームでサポートされているかどうかを確認する必要があります。
  • 必要な機能
    必要な機能が、QClipboard::mimeData()で提供されているかどうかを検討する必要があります。