Qt 剪貼板操作

2018-10-08 09:57 更新

剪貼板操作

剪貼板的操作經(jīng)常和前面所說的拖放技術(shù)在一起使用,因此我們現(xiàn)在先來說說剪貼板的相關(guān)操作。大家對剪貼板都很熟悉。我們可以簡單的把它理解成一個數(shù)據(jù)的存儲池,可以把外面的數(shù)據(jù)放置進(jìn)去,也可以把里面的數(shù)據(jù)取出來。剪貼板是由操作系統(tǒng)維護(hù)的,所以這提供了跨應(yīng)用程序數(shù)據(jù)交互的一種方式。Qt 已經(jīng)為我們封裝好很多關(guān)于剪貼板的操作,因此我們可以在自己的應(yīng)用中很容易的實現(xiàn)。下面還是從代碼開始:

clipboarddemo.h


#ifndef CLIPBOARDDEMO_H  
#define CLIPBOARDDEMO_H  

#include <QtGui/QWidget>  

class ClipboardDemo : public QWidget  
{  
    Q_OBJECT  

public:  
    ClipboardDemo(QWidget *parent = 0);  

private slots:  
    void setClipboard();  
    void getClipboard();  
};  

#endif // CLIPBOARDDEMO_H 

clipboarddemo.cpp


#include <QtGui>  
#include "clipboarddemo.h"  

ClipboardDemo::ClipboardDemo(QWidget *parent)  
    : QWidget(parent)  
{  
    QVBoxLayout *mainLayout = new QVBoxLayout(this);  
    QHBoxLayout *northLayout = new QHBoxLayout;  
    QHBoxLayout *southLayout = new QHBoxLayout;  

    QTextEdit *editor = new QTextEdit;  
    QLabel *label = new QLabel;  
    label->setText("Text Input: ");  
    label->setBuddy(editor);  
    QPushButton *copyButton = new QPushButton;  
    copyButton->setText("Set Clipboard");  
    QPushButton *pasteButton = new QPushButton;  
    pasteButton->setText("Get Clipboard");  

    northLayout->addWidget(label);  
    northLayout->addWidget(editor);  
    southLayout->addWidget(copyButton);  
    southLayout->addWidget(pasteButton);  
    mainLayout->addLayout(northLayout);  
    mainLayout->addLayout(southLayout);  

    connect(copyButton, SIGNAL(clicked()), this, SLOT(setClipboard()));  
    connect(pasteButton, SIGNAL(clicked()), this, SLOT(getClipboard()));  
}  

void ClipboardDemo::setClipboard()  
{  
    QClipboard *board = QApplication::clipboard();  
    board->setText("Text from Qt Application");  
}  

void ClipboardDemo::getClipboard()  
{  
    QClipboard *board = QApplication::clipboard();  
    QString str = board->text();  
    QMessageBox::information(NULL, "From clipboard", str);  
}

main.cpp


#include "clipboarddemo.h"  

#include <QtGui>  
#include <QApplication>  

int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    ClipboardDemo w;  
    w.show();  
    return a.exec();  
} 

main() 函數(shù)很簡單,就是把我們的 ClipboardDemo 類顯示了出來。我們重點(diǎn)來看 ClipboardDemo 中的代碼。

構(gòu)造函數(shù)同樣沒什么復(fù)雜的內(nèi)容,我們把一個 label。一個 textedit 和兩個 button擺放到窗口中。這些代碼已經(jīng)能夠很輕易的寫出來了;然后進(jìn)行了信號槽的連接。


void ClipboardDemo::setClipboard()  
{  
    QClipboard *board = QApplication::clipboard();  
    board->setText("Text from Qt Application");  
}  

void ClipboardDemo::getClipboard()  
{  
    QClipboard *board = QApplication::clipboard();  
    QString str = board->text();  
    QMessageBox::information(NULL, "From clipboard", str);  
} 

在 slot 函數(shù)中,我們使用 QApplication::clipboard() 函數(shù)訪問到系統(tǒng)剪貼板。這個函數(shù)的返回值是 QClipboard 的指針。我們可以從這個類的 API 中看到,通過 setText(),setImage() 或者 setPixmap() 函數(shù)可以將數(shù)據(jù)放置到剪貼板內(nèi),也就是通常所說的剪貼或者復(fù)制的操作;使用 text(),image() 或者 pixmap() 函數(shù)則可以從剪貼板獲得數(shù)據(jù),也就是粘貼。

另外值得說的是,通過上面的例子可以看出,QTextEdit 默認(rèn)就是支持 Ctrl+C, Ctrl+V 等快捷鍵操作的。不僅如此,很多 Qt 的組件都提供了很方便的操作,因此我們需要從文檔中獲取具體的信息,從而避免自己重新去發(fā)明輪子。

QClipboard 提供的數(shù)據(jù)類型很少,如果需要,我們可以繼承 QMimeData 類,通過調(diào)用 setMimeData() 函數(shù)讓剪貼板能夠支持我們自己的數(shù)據(jù)類型。

在 X11 系統(tǒng)中,鼠標(biāo)中鍵(一般就是滾輪)可以支持剪貼操作的。為了實現(xiàn)這一功能,我們需要向 QClipboard::text() 函數(shù)傳遞 QClipboard::Selection 參數(shù)。例如,我們在鼠標(biāo)按鍵釋放的事件中進(jìn)行如下處理:


void MyTextEditor::mouseReleaseEvent(QMouseEvent *event)  
{  
    QClipboard *clipboard = QApplication::clipboard();  
    if (event->button() == Qt::MidButton  
            && clipboard->supportsSelection()) {  
        QString text = clipboard->text(QClipboard::Selection);  
        pasteText(text);  
    }  
}

這里的 supportsSelection() 在 X11 平臺返回 true,其余平臺都是返回 false 的。另外,QClipboard 提供了 dataChanged() 信號,以便監(jiān)聽剪貼板數(shù)據(jù)變化。

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號