剪貼板的操作經常和前面所說的拖放技術在一起使用,因此我們現在先來說說剪貼板的相關操作。
大家對剪貼板都很熟悉。我們可以簡單的把它理解成一個數據的存儲池,可以把外面的數據放置進去,也可以把裡面的數據取出來。剪貼板是由操作系統維護的,所以這提供了跨應用程序數據交互的一種方式。Qt 已經為我們封裝好很多關於剪貼板的操作,因此我們可以在自己的應用中很容易的實現。下面還是從代碼開始:
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() 函數很簡單,就是把我們的 ClipboardDemo 類顯示了出來。我們重點來看 ClipboardDemo 中的代碼。
構造函數同樣沒什麼復雜的內容,我們把一個label。一個 textedit 和兩個 button擺放到窗口中。這些代碼已經能夠很輕易的寫出來了;然後進行了信號槽的連接。
- 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 函數中,我們使用 QApplication::clipboard() 函數訪問到系統剪貼板。這個函數的返回值是 QClipboard 的指針。我們可以從這個類的 API 中看到,通過 setText(),setImage() 或者 setPixmap() 函數可以將數據放置到剪貼板內,也就是通常所說的剪貼或者復制的操作;使用 text(),image() 或者 pixmap() 函數則可以從剪貼板獲得數據,也就是粘貼。
另外值得說的是,通過上面的例子可以看出,QTextEdit 默認就是支持 Ctrl+C, Ctrl+V 等快捷鍵操作的。不僅如此,很多 Qt 的組件都提供了很方便的操作,因此我們需要從文檔中獲取具體的信息,從而避免自己重新去發明輪子。
QClipboard 提供的數據類型很少,如果需要,我們可以繼承 QMimeData 類,通過調用 setMimeData() 函數讓剪貼板能夠支持我們自己的數據類型。
在 X11 系統中,鼠標中鍵(一般就是滾輪)可以支持剪貼操作的。為了實現這一功能,我們需要向 QClipboard::text() 函數傳遞 QClipboard::Selection 參數。例如,我們在鼠標按鍵釋放的事件中進行如下處理:
- 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() 信號,以便監聽剪貼板數據變化。
本文出自 “豆子空間” 博客,請務必保留此出處http://devbean.blog.51cto.com/448512/292229