很多应用程序使用Qt提供的剪贴板。例如:QTextEdit类提供了cut(),copy()和paste()槽函数,也能相应键盘的快捷键。客户程序只要编写很少的代码,甚至不写代码。
如果我们正在开发自己的类,可以使用函数QApplication::clipboard()得到Qt的剪贴板,该函数返回的是一个QClipboard类型对象的指针。使用这个指针很容器对剪贴板进行读写访问,调用setText(),setImage(),setPixmap()把数据写到剪贴板。调用text(),image(),pixmap()得到剪贴板里的数据。在第4章中的Spreadsheet程序中就是一个使用剪贴板的例子。
对于有些应用程序来说,Qt提供的剪贴板是不够用的。除了文本和图像等类型的数据,我们还想让程序支持更多类型的数据,让自己的程序和其他应用程序进行交互。这个问题和拖拽很相似,解决方法也是一样:继承类QMimeData,重新实现几个虚函数。
如果我们的程序用一个QMimeData子类支持拖拽,那么这个子类可以用在剪贴板中。用函数setMimeData()把数据写到剪贴板,函数mimeData()得到剪贴板的数据。
在X11系统,通常会点击三键鼠标的中间键完成对选择数据的粘贴操作。在Qt中用一个单独的“选择”剪贴板。如果一个控件要支持这种剪贴板,同时也要支持标准的剪贴板,需要在QClipboard函数调用中使用QClipboard::Selection参数,下面的函数mouseReleaseEvent()是一个文本编辑器的鼠标相应函数,支持鼠标中键粘贴。
void MyTextEditor::mouseReleaseEvent(QMouseEvent *event)
{
QClipboard *clipboard = QApplication::clipboard();
if (event->button() == Qt::MidButton
&& clipboard->supportsSelection()) {
QString text = clipboard->text(QClipboard::Selection);
pasteText(text);
}
}
在X11中,supportsSelection()返回true。在其他平台上返回false。
剪贴板中的数据改变时,QClipboard会发出QClipboard::dataChanged()信号。