Qt 剪貼板操作

2018-10-08 09:57 更新

剪貼板操作

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

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ù)很簡(jiǎn)單,就是把我們的 ClipboardDemo 類(lèi)顯示了出來(lái)。我們重點(diǎn)來(lái)看 ClipboardDemo 中的代碼。

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


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ù)訪(fǎng)問(wèn)到系統(tǒng)剪貼板。這個(gè)函數(shù)的返回值是 QClipboard 的指針。我們可以從這個(gè)類(lèi)的 API 中看到,通過(guò) setText(),setImage() 或者 setPixmap() 函數(shù)可以將數(shù)據(jù)放置到剪貼板內(nèi),也就是通常所說(shuō)的剪貼或者復(fù)制的操作;使用 text(),image() 或者 pixmap() 函數(shù)則可以從剪貼板獲得數(shù)據(jù),也就是粘貼。

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

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

在 X11 系統(tǒng)中,鼠標(biāo)中鍵(一般就是滾輪)可以支持剪貼操作的。為了實(shí)現(xiàn)這一功能,我們需要向 QClipboard::text() 函數(shù)傳遞 QClipboard::Selection 參數(shù)。例如,我們?cè)谑髽?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 平臺(tái)返回 true,其余平臺(tái)都是返回 false 的。另外,QClipboard 提供了 dataChanged() 信號(hào),以便監(jiān)聽(tīng)剪貼板數(shù)據(jù)變化。

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)