程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Qt學習之路(55): 剪貼板操作

Qt學習之路(55): 剪貼板操作

編輯:關於C語言

剪貼板的操作經常和前面所說的拖放技術在一起使用,因此我們現在先來說說剪貼板的相關操作。

大家對剪貼板都很熟悉。我們可以簡單的把它理解成一個數據的存儲池,可以把外面的數據放置進去,也可以把裡面的數據取出來。剪貼板是由操作系統維護的,所以這提供了跨應用程序數據交互的一種方式。Qt 已經為我們封裝好很多關於剪貼板的操作,因此我們可以在自己的應用中很容易的實現。下面還是從代碼開始:

clipboarddemo.h

  1. #ifndef CLIPBOARDDEMO_H  
  2. #define CLIPBOARDDEMO_H  
  3.  
  4. #include <QtGui/QWidget>  
  5.  
  6. class ClipboardDemo : public QWidget  
  7. {  
  8.     Q_OBJECT  
  9.  
  10. public:  
  11.     ClipboardDemo(QWidget *parent = 0);  
  12.  
  13. private slots:  
  14.     void setClipboard();  
  15.     void getClipboard();  
  16. };  
  17.  
  18. #endif // CLIPBOARDDEMO_H 

clipboarddemo.cpp

  1. #include <QtGui>  
  2. #include "clipboarddemo.h"  
  3.  
  4. ClipboardDemo::ClipboardDemo(QWidget *parent)  
  5.     : QWidget(parent)  
  6. {  
  7.     QVBoxLayout *mainLayout = new QVBoxLayout(this);  
  8.     QHBoxLayout *northLayout = new QHBoxLayout;  
  9.     QHBoxLayout *southLayout = new QHBoxLayout;  
  10.  
  11.     QTextEdit *editor = new QTextEdit;  
  12.     QLabel *label = new QLabel;  
  13.     label->setText("Text Input: ");  
  14.     label->setBuddy(editor);  
  15.     QPushButton *copyButton = new QPushButton;  
  16.     copyButton->setText("Set Clipboard");  
  17.     QPushButton *pasteButton = new QPushButton;  
  18.     pasteButton->setText("Get Clipboard");  
  19.  
  20.     northLayout->addWidget(label);  
  21.     northLayout->addWidget(editor);  
  22.     southLayout->addWidget(copyButton);  
  23.     southLayout->addWidget(pasteButton);  
  24.     mainLayout->addLayout(northLayout);  
  25.     mainLayout->addLayout(southLayout);  
  26.  
  27.     connect(copyButton, SIGNAL(clicked()), this, SLOT(setClipboard()));  
  28.     connect(pasteButton, SIGNAL(clicked()), this, SLOT(getClipboard()));  
  29. }  
  30.  
  31. void ClipboardDemo::setClipboard()  
  32. {  
  33.     QClipboard *board = QApplication::clipboard();  
  34.     board->setText("Text from Qt Application");  
  35. }  
  36.  
  37. void ClipboardDemo::getClipboard()  
  38. {  
  39.     QClipboard *board = QApplication::clipboard();  
  40.     QString str = board->text();  
  41.     QMessageBox::information(NULL, "From clipboard", str);  
  42. }  

main.cpp

  1. #include "clipboarddemo.h"  
  2.  
  3. #include <QtGui>  
  4. #include <QApplication>  
  5.  
  6. int main(int argc, char *argv[])  
  7. {  
  8.     QApplication a(argc, argv);  
  9.     ClipboardDemo w;  
  10.     w.show();  
  11.     return a.exec();  
  12. }  

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

構造函數同樣沒什麼復雜的內容,我們把一個label。一個 textedit 和兩個 button擺放到窗口中。這些代碼已經能夠很輕易的寫出來了;然後進行了信號槽的連接。

  1. void ClipboardDemo::setClipboard()  
  2. {  
  3.     QClipboard *board = QApplication::clipboard();  
  4.     board->setText("Text from Qt Application");  
  5. }  
  6.  
  7. void ClipboardDemo::getClipboard()  
  8. {  
  9.     QClipboard *board = QApplication::clipboard();  
  10.     QString str = board->text();  
  11.     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 參數。例如,我們在鼠標按鍵釋放的事件中進行如下處理:

  1. void MyTextEditor::mouseReleaseEvent(QMouseEvent *event)  
  2. {  
  3.     QClipboard *clipboard = QApplication::clipboard();  
  4.     if (event->button() == Qt::MidButton  
  5.             && clipboard->supportsSelection()) {  
  6.         QString text = clipboard->text(QClipboard::Selection);  
  7.         pasteText(text);  
  8.     }  

這裡的 supportsSelection() 在 X11 平台返回 true,其余平台都是返回 false 的。

另外,QClipboard 提供了 dataChanged() 信號,以便監聽剪貼板數據變化。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved