QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 1156|回复: 0

[C/C++/Qt] Qt 剪贴板操作

[复制链接]

等级头衔

积分成就    金币 : 2806
   泡泡 : 1516
   精华 : 6
   在线时间 : 1244 小时
   最后登录 : 2024-5-5

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-3-7 10:16:49 | 显示全部楼层 |阅读模式
       剪贴板的操作经常和前面所说的拖放技术在一起使用,因此我们现在先来说说剪贴板的相关操作。大家对剪贴板都很熟悉。我们可以简单的把它理解成一个数据的存储池,可以把外面的数据放置进去,也可以把里面的数据取出来。剪贴板是由操作系统维护的,所以这提供了跨应用程序数据交互的一种方式。Qt 已经为我们封装好很多关于剪贴板的操作,因此我们可以在自己的应用中很容易的实现。下面还是从代码开始:' |/ Z2 a- A, Y( j1 v7 O
clipboarddemo.h' H, k+ E9 C9 m
  1. #ifndef CLIPBOARDDEMO_H
  2. #define CLIPBOARDDEMO_H
  3. #include <QtGui/QWidget>
  4. class ClipboardDemo : public QWidget
  5. {
  6.     Q_OBJECT
  7. public:
  8.     ClipboardDemo(QWidget *parent = 0);
  9. private slots:
  10.     void setClipboard();
  11.     void getClipboard();
  12. };
  13. #endif // CLIPBOARDDEMO_H
clipboarddemo.cpp% R7 f5 Y- v2 @5 |% E
  1. #include <QtGui>
  2. #include "clipboarddemo.h"
  3. ClipboardDemo::ClipboardDemo(QWidget *parent)
  4.     : QWidget(parent)
  5. {
  6.     QVBoxLayout *mainLayout = new QVBoxLayout(this);
  7.     QHBoxLayout *northLayout = new QHBoxLayout;
  8.     QHBoxLayout *southLayout = new QHBoxLayout;
  9.     QTextEdit *editor = new QTextEdit;
  10.     QLabel *label = new QLabel;
  11.     label->setText("Text Input: ");
  12.     label->setBuddy(editor);
  13.     QPushButton *copyButton = new QPushButton;
  14.     copyButton->setText("Set Clipboard");
  15.     QPushButton *pasteButton = new QPushButton;
  16.     pasteButton->setText("Get Clipboard");
  17.     northLayout->addWidget(label);
  18.     northLayout->addWidget(editor);
  19.     southLayout->addWidget(copyButton);
  20.     southLayout->addWidget(pasteButton);
  21.     mainLayout->addLayout(northLayout);
  22.     mainLayout->addLayout(southLayout);
  23.     connect(copyButton, SIGNAL(clicked()), this, SLOT(setClipboard()));
  24.     connect(pasteButton, SIGNAL(clicked()), this, SLOT(getClipboard()));
  25. }
  26. void ClipboardDemo::setClipboard()
  27. {
  28.     QClipboard *board = QApplication::clipboard();
  29.     board->setText("Text from Qt Application");
  30. }
  31. void ClipboardDemo::getClipboard()
  32. {
  33.     QClipboard *board = QApplication::clipboard();
  34.     QString str = board->text();
  35.     QMessageBox::information(NULL, "From clipboard", str);
  36. }
main.cpp
8 |) j3 J# q1 b: Y5 h7 o# N/ F% [
  1. #include "clipboarddemo.h"
  2. #include <QtGui>
  3. #include <QApplication>
  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication a(argc, argv);
  7.     ClipboardDemo w;
  8.     w.show();
  9.     return a.exec();
  10. }
      main() 函数很简单,就是把我们的 ClipboardDemo 类显示了出来。我们重点来看 ClipboardDemo 中的代码。$ X6 m- \# h% B! ?1 l7 i
       构造函数同样没什么复杂的内容,我们把一个 label。一个 textedit 和两个 button摆放到窗口中。这些代码已经能够很轻易的写出来了;然后进行了信号槽的连接。
' @9 n6 S( J8 X2 [( O/ X# t
  1. void ClipboardDemo::setClipboard()
  2. {
  3.     QClipboard *board = QApplication::clipboard();
  4.     board->setText("Text from Qt Application");
  5. }
  6. void ClipboardDemo::getClipboard()
  7. {
  8.     QClipboard *board = QApplication::clipboard();
  9.     QString str = board->text();
  10.     QMessageBox::information(NULL, "From clipboard", str);
  11. }
      在 slot 函数中,我们使用 QApplication::clipboard() 函数访问到系统剪贴板。这个函数的返回值是 QClipboard 的指针。我们可以从这个类的 API 中看到,通过 setText(),setImage() 或者 setPixmap() 函数可以将数据放置到剪贴板内,也就是通常所说的剪贴或者复制的操作;使用 text(),image() 或者 pixmap() 函数则可以从剪贴板获得数据,也就是粘贴。4 G6 V5 B! x7 m# x, u. E4 s
       另外值得说的是,通过上面的例子可以看出,QTextEdit 默认就是支持 Ctrl+C, Ctrl+V 等快捷键操作的。不仅如此,很多 Qt 的组件都提供了很方便的操作,因此我们需要从文档中获取具体的信息,从而避免自己重新去发明轮子。
6 L' s- p! t1 g! Q       QClipboard 提供的数据类型很少,如果需要,我们可以继承 QMimeData 类,通过调用 setMimeData() 函数让剪贴板能够支持我们自己的数据类型。
; Z( e5 K8 |7 M% l. k6 W       在 X11 系统中,鼠标中键(一般就是滚轮)可以支持剪贴操作的。为了实现这一功能,我们需要向 QClipboard::text() 函数传递 QClipboard::Selection 参数。例如,我们在鼠标按键释放的事件中进行如下处理:3 i& y2 J7 K2 g3 W+ Q; w( g
  1. void MyTextEditor::mouseReleaseEvent(QMouseEvent *event)
  2. {
  3.     QClipboard *clipboard = QApplication::clipboard();
  4.     if (event->button() == Qt::MidButton
  5.             && clipboard->supportsSelection()) {
  6.         QString text = clipboard->text(QClipboard::Selection);
  7.         pasteText(text);
  8.     }
  9. }
      这里的 supportsSelection() 在 X11 平台返回 true,其余平台都是返回 false 的。另外,QClipboard 提供了 dataChanged() 信号,以便监听剪贴板数据变化。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-12 05:52

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表