W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
剪貼板的操作經(jīng)常和前面所說的拖放技術(shù)在一起使用,因此我們現(xiàn)在先來說說剪貼板的相關(guān)操作。大家對剪貼板都很熟悉。我們可以簡單的把它理解成一個數(shù)據(jù)的存儲池,可以把外面的數(shù)據(jù)放置進(jìn)去,也可以把里面的數(shù)據(jù)取出來。剪貼板是由操作系統(tǒng)維護(hù)的,所以這提供了跨應(yīng)用程序數(shù)據(jù)交互的一種方式。Qt 已經(jīng)為我們封裝好很多關(guān)于剪貼板的操作,因此我們可以在自己的應(yīng)用中很容易的實現(xiàn)。下面還是從代碼開始:
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ù)很簡單,就是把我們的 ClipboardDemo 類顯示了出來。我們重點(diǎn)來看 ClipboardDemo 中的代碼。
構(gòu)造函數(shù)同樣沒什么復(fù)雜的內(nèi)容,我們把一個 label。一個 textedit 和兩個 button擺放到窗口中。這些代碼已經(jīng)能夠很輕易的寫出來了;然后進(jìn)行了信號槽的連接。
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ù)訪問到系統(tǒng)剪貼板。這個函數(shù)的返回值是 QClipboard 的指針。我們可以從這個類的 API 中看到,通過 setText(),setImage() 或者 setPixmap() 函數(shù)可以將數(shù)據(jù)放置到剪貼板內(nèi),也就是通常所說的剪貼或者復(fù)制的操作;使用 text(),image() 或者 pixmap() 函數(shù)則可以從剪貼板獲得數(shù)據(jù),也就是粘貼。
另外值得說的是,通過上面的例子可以看出,QTextEdit 默認(rèn)就是支持 Ctrl+C, Ctrl+V 等快捷鍵操作的。不僅如此,很多 Qt 的組件都提供了很方便的操作,因此我們需要從文檔中獲取具體的信息,從而避免自己重新去發(fā)明輪子。
QClipboard 提供的數(shù)據(jù)類型很少,如果需要,我們可以繼承 QMimeData 類,通過調(diào)用 setMimeData() 函數(shù)讓剪貼板能夠支持我們自己的數(shù)據(jù)類型。
在 X11 系統(tǒng)中,鼠標(biāo)中鍵(一般就是滾輪)可以支持剪貼操作的。為了實現(xiàn)這一功能,我們需要向 QClipboard::text() 函數(shù)傳遞 QClipboard::Selection 參數(shù)。例如,我們在鼠標(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 平臺返回 true,其余平臺都是返回 false 的。另外,QClipboard 提供了 dataChanged() 信號,以便監(jiān)聽剪貼板數(shù)據(jù)變化。
本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: