【Qt 6】读写剪贴板
剪贴板是个啥就不用多介绍了,最直观的功能是实现应用程序之间数据共享。就是咱们常说的“复制”、“粘贴”功能。
在 Qt 中,QClipboard 类提供了相关 API 让应用程序具备读/写剪贴板的能力。数据通过QMimeData 类包装。该类使用 MIME 类型来标识数据。比如,要包装的数据是纯文本内容,就使用 text/plain;如果是 PNG 图像数据,就用 image/png。当然,自定义类型也是可以的,如 application/xxx。
QMimeData 的核心方法是 setData 和 data。setData 方法用来放入数据,data 方法用来取出数据。setData 方法的签名如下:
(资料图片)
void setData(const QString &mimetype, const QByteArray &data);
mimetype 参数为字符串,指定数据的 MIME 类型;data 参数就是数据本尊,类型为字节序列。通过 setData 方法的签名,咱们也能知道,QMimeData 类可以放任意内容。要获取数据时,data 方法需要通过 MIME 类型来检索。
为了便于存取常见的数据——如文本、图像、HTML文本等,QMimeData 类提供一些封装好的方法成员:
文本 | setText | 设置普通文本 |
text | 获取普通文本 | |
hasText | 判断是否存在文本数据 | |
HTML文本 | setHtml | 设置 HTML 文本 |
html | 获取HTML文本 | |
hasHtml | 判断是否存在 HTML 文本数据 | |
URL | setUrls | 设置 URL 列表,参数为 QList |
urls | 获取 URL 列表 | |
hasUrls | 检测是否存在 URL 列表 | |
图像 | setImageData | 设置图像数据 |
imageData | 获取图像数据 | |
hasImage | 判断是否存在图像数据 | |
颜色 | setColorData | 设置颜色数据 |
colorData | 获取颜色数据 | |
hasColor | 是否存在颜色数据 |
QClipboard 类不能直接实例化使用,它由 QGuiApplication 类的静态成员 clipboard 公开。该静态成员返回 QClipboard 类的指针,程序代码将通过这个指针来访问 QClipboard 对象。由于QApplication 类派生自 QGuiApplication,当然也继承了 clipboard 成员。
下面做一个简单的练习:复制和粘贴文本。
MyWindow 类的头文件。
class MyWindow : public QWidget{ Q_OBJECTpublic: MyWindow(QWidget* parent = nullptr); ~MyWindow();private: void _initUi(); // 私有方法 // 下面是私有字段 QLineEdit* _txtInput; QLabel* _lbTxt; QPushButton* _btnCopy; QPushButton* _btnPaste; // 用来布局控件的 QGridLayout* _layout; // 下面成员响应 clicked 信号 void onCopy(); void onPaste();};
_initUi 方法负责初始化窗口上的东西。这个窗口有四个组件:一个 QLineEdit 用来输入文本;一个 QLabel 用来显示文本;然后是两个按钮—— 执行“复制”和“粘贴”操作。
后面两个方法 onCopy 和 onPaste 分别与两个按钮的 clicked 信号绑定。
构造函数的实现比较简单,就是调用 _initUi 方法。
MyWindow::MyWindow(QWidget* parent) : QWidget::QWidget(parent){ // 初始化UI this -> _initUi();}MyWindow::~MyWindow(){}
析构函数这里啥也不做。
下面是 _intUi 的实现代码。
void MyWindow::_initUi(){ // 设置一下窗口 this->setWindowTitle("复制粘贴文本"); this->setGeometry(560, 480, 320, 150); this->setMinimumSize(300, 150); _txtInput = new QLineEdit(); _lbTxt = new QLabel(); _btnCopy = new QPushButton("复制"); _btnPaste = new QPushButton("粘贴"); _layout = new QGridLayout(this); // 设置空白 _layout->setSpacing(12); // 放置各控件 _layout->addWidget(_txtInput, 0, 0); _layout->addWidget(_btnCopy, 1, 0); _layout->addWidget(_lbTxt, 0, 2); _layout->addWidget(_btnPaste, 1, 2); _layout->setColumnStretch(0, 2); _layout->setColumnStretch(1, 1); _layout->setColumnStretch(2, 2); // 绑定信号和槽 connect(_btnCopy, &QPushButton::clicked, this, &MyWindow::onCopy); connect(_btnPaste, &QPushButton::clicked, this, &MyWindow::onPaste);}
QGridLayout 类也是一个组件,以网格方式布局各组件。网格的行和列是自动划分的。上面代码中其实用到了三列两行:
1、QLineEdit 在第一列第一行;
2、第二列空着,没放东西;
3、 QLabel 组件在第三列第一行;
4、“复制”按钮在第一列第二行;
5、“粘贴”按钮在第二行第二行。
这三行是设定空间比例的。
_layout->setColumnStretch(0, 2); _layout->setColumnStretch(1, 1); _layout->setColumnStretch(2, 2);
这意思就是,列的总宽平均分为4份,第一列和第三列都占两份,第二列只占一份。
随后是与 clicked 信号绑定的两个私有方法。
void MyWindow::onCopy(){ // 获得 QClipboard 的引用 QClipboard* clboard = QApplication::clipboard(); // 设置文本数据 clboard -> setText(_txtInput -> text());}void MyWindow::onPaste(){ // 过程差不多 QClipboard* cb = QApplication::clipboard(); QString s = cb->text(); // 显示粘贴的文本 _lbTxt->setText(s);}
最后是 main 函数的代码:
int main(int argc, char** argv){ QApplication app(argc, argv); MyWindow win; win.show(); return app.exec();}
运行程序,先输入一些文本,点击“复制”;再点击“粘贴”,被复制的文本就会显示出来了。
这个例子用了 QClipboard 类公开的封装方法,不需要操作 QMimeData 类。针对常用的数据格式,可直接用。
1、text、setText:设置或获取文本;
2、setImage 和 image:设置或获取图像(QImage类型);
3、setPixmap 和 pixmap:设置或获取图像(QPixmap类型)。
后面两个是读写图像的。
对于图像数据的复制和粘贴,操作流程差不多,大伙伴有兴趣可以试试。
前文提到过,除了常见的数据格式外,QMimeData 允许自定义格式,用 MIME 来标识。
接下来,咱们做个练习,复制和粘贴生日贺卡信息。假设生日贺卡信息包括姓名、生日、祝福语。咱们用自定义的数据格式将其复制,也可以粘贴到应用程序上。MIME 类型为 application/bug。
以下是自定义窗口类的头文件定义。
#ifndef APP_H#define APP_H#include#include #include #include class CustWind : public QWidget{ Q_OBJECTpublic: CustWind(QWidget* parent = nullptr);private: QLineEdit* txtName; QLineEdit* txtWish; QDateEdit* txtDate; QPushButton* btnCopy; QPushButton* btnPaste; // 与 clicked 信号绑定的方法(Slots) void onCopy(); void onPaste();};#endif
在包含头文件时,用带 .h 后缀和不用后是一样的,既可以用
在构造函数中,初始化各类可视对象。
CustWind::CustWind(QWidget *parent) : QWidget::QWidget(parent){ // 初始化组件 txtName = new QLineEdit(); txtWish = new QLineEdit(); txtDate = new QDateEdit(); // 有效日期范围 txtDate -> setMinimumDate(QDate(1950, 1, 1)); txtDate -> setMaximumDate(QDate(2085, 12, 31)); btnCopy = new QPushButton("复制生日贺卡"); btnPaste = new QPushButton("粘贴生日贺卡"); // 布局 QFormLayout* layout = new QFormLayout(this); layout->addRow("姓名:", txtName); layout->addRow("生日:", txtDate); layout->addRow("祝福语:", txtWish); QVBoxLayout *sublayout = new QVBoxLayout(); sublayout->addWidget(btnCopy); sublayout->addWidget(btnPaste); layout ->addRow(sublayout); // 连接信号和槽 connect(btnCopy,&QPushButton::clicked,this,&CustWind::onCopy); connect(btnPaste,&QPushButton::clicked,this,&CustWind::onPaste);}
这个例子咱们用 QFormLayout 来布局界面。其含义和 HTML 中
下一篇:最后一页
- 广州科技活动周进入预热 明日正式启动300多场主题活动接踵而来
- 深化重点领域信用建设 广州正式出台新型监管机制实施方案
- 女童不慎掉入20米深井 18岁小姨三次下井成功营救
- 西安3个区域12月28日起每日开展全员核酸 官方提倡民众居家健身
- 浙江乐清一核酸检测结果异常人员 复采复检为阴性
- 浙江本轮疫情报告确诊病例490例 提倡“双节”非必要不出省
- 西安警方通报6起涉疫违法案件
- 西安新一轮核酸筛查日检测能力达160万管
- 西安市累计报告本土确诊病例811例
- 重庆曝光4起违反中央八项规定精神典型问题 警示党员干部清新过节
-
步甲虫用什么药消灭_拟步甲虫怎么彻底消灭简介介绍 世界微头条
1、1、2、可以利用清洁、杀虫药、洋葱等方式消灭步甲虫。3、1、保持清理:对房屋进行全方位清理,不留下死
-
后天同星科技申购,值得打吗?
后天同星科技申购,值得打吗?,同星科技后天新股申购,以下为新股介绍:同星科技(301252)申购时间为5月15
-
天天热讯:保定市主城区12条街道完成命名
近日,保定市公布关于“立德街”等12条街路命名的通知。经市政府批准,予以命名。立德街:南北走向,北起隆
-
世界观天下!Stein:前康涅狄格大学主帅凯文-奥利为下任活塞主帅的领跑者
Stein:前康涅狄格大学主帅凯文-奥利为下任活塞主帅的领跑者,科林斯,查尔斯,雄鹿队,领跑者,凯文-奥利,康涅
-
罗古中学_关于罗古中学介绍 天天速递
1、罗古中学位于武功县小村镇罗古村西,是武功县教育局直属的一所公办学校,始创于1979年,陕西省示范家长
-
刘强东急了,撤换CEO徐雷,平价京东要回来?|即时
刘强东没有看错人,三年时间,徐雷不但为刘强东守住了江山,还带领京东实现了最快的增长周期,营收和用户都
-
环球热门:十香词冤案_十香词
1、全是描写女子体臭(xiu)的,每首描写身体的一个方面,按照十首的次序是:发、乳、颊、颈、舌、口、手、足、
-
梦蛇之兆_梦蛇 当前聚焦
1、可事实并没有发生梦境与凶吉祸福无关,常常是白天人的记忆造成的梦,是大脑无意识中将脑内信息,无序的
-
扇贝柱的做法大全家常窍门_扇贝柱的做法简介介绍
对于扇贝柱的做法这个问题感兴趣的朋友应该很多,这个也是目前大家比较关注的问题,那么下面小好小编就收集
-
天天快资讯丨物业包干制和酬金制的区别_包干制和酬金制的区别
1、问题一:经常听到有人提到包干制和酬金制,究竟什么是包干制和酬金制呢?包干制是指由业主向物业管理企
X 关闭
【Qt 6】读写剪贴板
【天天报资讯】湖南省征集志愿怎么填写成人高考
邵阳一选手获第七届全国防震减灾科普讲解大赛三等奖
于高山之巅 探宇宙之源
环球视讯!尼克斯出局!锡伯杜:祝贺热火&他们打得强硬 我也为我们球员自豪
X 关闭
焦点讯息:水发燃气董秘回复:根据《上海证券交易所股票上市规则》的规定
西安警方完成研考安保工作 共出动警力逾1.3万人次
得知西安疫情防控“升级” 男子夜骑共享单车回咸阳淳化
中国医生将任SIU主席背后:从追随者同行者到引领者
海南省通报政法队伍教育整顿成果