剪貼板的操作經(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
更多建議: