【Qt笔记】剪贴板

剪贴板的操做常常和前面所说的拖放技术在一块儿使用。你们对剪贴板都很熟悉。咱们能够简单地把它理解成一个数据存储池,外面的数据能够存进去,里面数据也能够取出来。剪贴板是由操做系统维护的,因此这提供了跨应用程序的数据交互的一种方式。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()信号,以便监听剪贴板数据变化。事件

相关文章
相关标签/搜索