剪贴板的操做常常和前面所说的拖放技术在一块儿使用。你们对剪贴板都很熟悉。咱们能够简单地把它理解成一个数据存储池,外面的数据能够存进去,里面数据也能够取出来。剪贴板是由操做系统维护的,因此这提供了跨应用程序的数据交互的一种方式。Qt 已经为咱们封装好不少关于剪贴板的操做,咱们能够在本身的应用中很容易实现对剪贴板的支持,代码实现起来也是很简单的:函数
class ClipboardDemo : public QWidget { Q_OBJECT public: ClipboardDemo(QWidget *parent = 0); private slots: void setClipboardContent(); void getClipboardContent(); };
咱们定义了一个ClipboardDemo
类。这个类只有两个槽函数,一个是从剪贴板获取内容,一个是给剪贴板设置内容。this
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 的组件都提供了很方便的操做,所以咱们须要从文档中获取具体的信息,从而避免本身从新去发明轮子。code
QClipboard
提供的数据类型不多,若是须要,咱们能够继承QMimeData
类,经过调用setMimeData()
函数让剪贴板可以支持咱们本身的数据类型。具体实现咱们已经在前面的章节中有过介绍,这里再也不赘述。orm
在 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()
信号,以便监听剪贴板数据变化。事件