#(54):剪貼板
剪貼板的操作經常和前面所說的拖放技術在一起使用。大家對剪貼板都很熟悉。我們可以簡單地把它理解成一個數據存儲池,外面的數據可以存進去,里面數據也可以取出來。剪貼板是由操作系統維護的,所以這提供了跨應用程序的數據交互的一種方式。Qt 已經為我們封裝好很多關于剪貼板的操作,我們可以在自己的應用中很容易實現對剪貼板的支持,代碼實現起來也是很簡單的:
~~~
class ClipboardDemo : public QWidget
{
Q_OBJECT
public:
ClipboardDemo(QWidget *parent = 0);
private slots:
void setClipboardContent();
void getClipboardContent();
};
~~~
我們定義了一個`ClipboardDemo`類。這個類只有兩個槽函數,一個是從剪貼板獲取內容,一個是給剪貼板設置內容。
~~~
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(setClipboardContent()));
connect(pasteButton, SIGNAL(clicked()), this, SLOT(getClipboardContent()));
}
~~~
主界面也很簡單:程序分為上下兩行,上一行顯示一個文本框,下一行是兩個按鈕,分別為設置剪貼板和讀取剪貼板。最主要的代碼還是在兩個槽函數中:
~~~
void ClipboardDemo::setClipboardContent()
{
QClipboard *board = QApplication::clipboard();
board->setText("Text from Qt Application");
}
void ClipboardDemo::getClipboardContent()
{
QClipboard *board = QApplication::clipboard();
QString str = board->text();
QMessageBox::information(NULL, "From clipboard", str);
}
~~~
槽函數也很簡單。我們使用`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。這樣,我們便可以為 X11 平臺提供額外的操作。
另外,`QClipboard`提供了`dataChanged()`信號,以便監聽剪貼板數據變化。
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)