2012年2月4日土曜日

( Qt C++ )クリップボードを使用する


それでは表題の件をやっていきます。

C++ GUI Programming with Qt4にはサンプルが載っていないので独自のサンプルを使います。

それではコードを

(テキストをクリップボードにセットし、取り出す。)
//アプリケーションのグローバルクリップボードのポインタを返す。
QClipboard *clipboard = QApplication::clipboard();

//テキストをセット
clipboard->setText("SampleClipBoard!");

//テキストの取り出し
QString str = QApplication::clipboard()->text();

(イメージをクリップボードにセットし、取り出す)
//アプリケーションのグローバルクリップボードのポインタを返す。
QClipboard *clipboard = QApplication::clipboard();

//イメージをセット
clipboard->setImage(QImage("/home/ubuntu001/icon.png"));

//イメージの取り出し
QImage img = QApplication::clipboard()->text();

(QPixmapをクリップボードにセットし、取り出す)
//アプリケーションのグローバルクリップボードのポインタを返す。
QClipboard *clipboard = QApplication::clipboard();

//QPixmapをセット
clipboard->setPixmap(QPixmap("/home/ubuntu001/icon.png"));

//QPixmapの取り出し
QPixmap pixmap = QApplication::clipboard()->pixmap();

(QMimeDataをクリップボードにセットし、取り出す)
//アプリケーションのグローバルクリップボードのポインタを返す。
QClipboard *clipboard = QApplication::clipboard();

QMimeData *mime = new QMimeData();
mime->setText("Hello World!");

//QMimeDataをセット
clipboard->setMimeData(mime);

//QMimeDataの取り出し
const QMimeData *myMimeData = QApplication::clipboard()->mimeData();

//なおQMimeDataの独自サブクラスをsetMimeDataで登録することもできるようです。

([ X11 window system ] 中ボタンクリックによる “selection” からのペースト)
※gnomeとかでできるあの "マウスで文字列選択→マウスの中ボタンで選択中文字列ペースト" のことです。
void MyTextEditor::mouseReleaseEvent(QMouseEvent *event)
{
    QClipboard *clipboard = QApplication::clipboard();

    if (event->button() == Qt::MidButton
            && clipboard->supportsSelection()) 
    {
        //QClipboard::Selectionを引数にすれば“selection”にアクセスできる
        //という意味。
        QString text = clipboard->text(QClipboard::Selection);
        pasteText(text);
    }
}

その他QClipboard::Modeでクリップボードの使用の制御ができるそうです。詳しくはリファレンスを参照してください。

※なお、QClipboard::dataChanged()シグナルのキャッチによりクリップボードの変更を監視できます。
以下のような感じで
//thisはMainWindow
//setLabelText()はクリックボード内のテキストをMainWindow内の
//ラベルに表示する処理を行っています。
connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(setLabelText()));
接続すればクリップボードの変更を検知して処理ができます。
(slot,signalがわからない方はQtをはじめようを参照してください。)

以上です。