我想使用Qt C写一个小demo使用Qt5.12.8,可以把我在剪切板剪切的文本打印出来QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET ClipboardDemo TEMPLATE app CONFIG c11 SOURCES \ main.cpp \ mainwindow.cpp HEADERS \ mainwindow.h#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QTextEdit #include QTimer #include QClipboard class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); private slots: void checkClipboard(); private: QTextEdit *textEdit; QTimer *timer; QString lastClipboardText; }; #endif // MAINWINDOW_H#include mainwindow.h #include QApplication #include QClipboard #include QMimeData #include QDateTime MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle(剪贴板监控 Demo); resize(600, 400); textEdit new QTextEdit(this); textEdit-setReadOnly(true); textEdit-setPlaceholderText(复制文本后内容将显示在这里...); setCentralWidget(textEdit); timer new QTimer(this); connect(timer, QTimer::timeout, this, MainWindow::checkClipboard); timer-start(500); // 每500ms检查一次剪贴板 } MainWindow::~MainWindow() { } void MainWindow::checkClipboard() { QClipboard *clipboard QApplication::clipboard(); const QMimeData *mimeData clipboard-mimeData(); if (mimeData-hasText()) { QString currentText mimeData-text(); if (currentText ! lastClipboardText) { lastClipboardText currentText; QString timestamp QDateTime::currentDateTime().toString(yyyy-MM-dd hh:mm:ss); textEdit-append(QString([%1]\n%2\n).arg(timestamp, currentText)); } } }这个程序会每 500ms 检查一次剪贴板当检测到新的文本内容时会在窗口中显示出来每条记录都带有时间戳给我讲讲QClipboardQClipboard 简介QClipboard是 Qt 中用于访问系统剪贴板的类位于QtGui模块。QClipboard *clipboard QApplication::clipboard();常用方法方法说明setText(const QString )设置剪贴板文本text()获取剪贴板文本setImage(const QImage )设置图像image()获取图像setPixmap(const QPixmap )设置像素图pixmap()获取像素图setMimeData(QMimeData *)设置自定义 MIME 数据mimeData()获取MIME 数据clear()清空剪贴板supportsSelection()是否支持选择剪贴板X11信号// 剪贴板内容变化时触发 connect(clipboard, QClipboard::dataChanged, this, MyClass::onClipboardChanged); // 其他信号 QClipboard::selectionChanged // 选择变化X11完整示例// 设置文本 QApplication::clipboard()-setText(Hello Qt!); // 获取文本 QString text QApplication::clipboard()-text(); // 检查是否有特定格式 const QMimeData *mimeData QApplication::clipboard()-mimeData(); if (mimeData-hasText()) { // 处理文本 } if (mimeData-hasImage()) { // 处理图像 } if (mimeData-hasUrls()) { // 处理 URL }在刚才的 Demo 中我们使用了定时器轮询的方式检测剪贴板变化因为QClipboard::dataChanged信号在某些平台如 Windows上可能不够可靠。你也可以直接用信号方式connect(QApplication::clipboard(), QClipboard::dataChanged, []() { QString text QApplication::clipboard()-text(); qDebug() 剪贴板内容: text; });那就尝试尝试吧。#include mainwindow.h #include QApplication #include QClipboard #include QMimeData #include QDateTime #include QDebug MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle(剪贴板监控 Demo); resize(600, 400); textEdit new QTextEdit(this); textEdit-setReadOnly(true); textEdit-setPlaceholderText(复制文本后内容将显示在这里...); setCentralWidget(textEdit); connect(QApplication::clipboard(), QClipboard::dataChanged, this, MainWindow::onClipboardChanged); } MainWindow::~MainWindow() { } void MainWindow::onClipboardChanged() { QString currentText QApplication::clipboard()-text(); qDebug() currentText; if (currentText ! lastClipboardText) { lastClipboardText currentText; QString timestamp QDateTime::currentDateTime().toString(yyyy-MM-dd hh:mm:ss); textEdit-append(QString([%1]\n%2\n).arg(timestamp, currentText)); } }确实有问题有部分可以触发有蛮多好像都有问题了。又测试了测试还是使用定时器版本体验好很多。假设我现在希望可以是实现这样的效果在电脑a上我复制了一段话m这时候电脑b上去粘贴时可以粘贴出m。反过来在电脑b上我复制了一段话n这时候电脑a上去粘贴时可以粘贴出n。这样看的话 这个功能应该是共享剪切板。你帮我分析一下可行性核心思路电脑A 网络通信 电脑B ┌─────────────┐ ┌─────────────┐ │ 本地剪贴板 │ ←── 同步剪贴板内容 ──→ │ 本地剪贴板 │ │ (QClipboard)│ (TCP/UDP) │ (QClipboard)│ └─────────────┘ └─────────────┘数据同步检测到本地变化 → 发送给对方 → 对方写入剪贴板回环抑制— 最重要需要标记这次变化来自远程避免无限循环我想要使用QUdpSocket然后我不想要使用dataChanged我想使用QTimer待写
企业数字化 ERP 产品动态
相关推荐
Flink+Kafka+HBase商品实时推荐系统实战:源码解析与避坑指南 简介:基于 Flink 的商品实时推荐系统完整项目源码,面向大数据、人工智能、物联网等专业的毕业设计、课程设计与 Flink 进阶学习者。系统以 Kafka 接收用户评分行为,由 Flink 完成实时与离线两类推荐:实时侧包括基于行为的推荐和实… · 2026/9/26 7:29:19
知识管理 Skill 实战:从采集到输出的 AI 生产力系统搭建指南 先说明一点:这篇不是我拍脑袋编出来的软件推荐清单,而是把我过去一年多实际试过的知识管理 Skill 用法,按“生产力系统”的思路重新串了一遍。你以为 50 个 Skill 是 50 个互不相干的工具?真不是。它们本身就是一个可以分层的系统… · 2026/9/26 7:29:19
Access数据库源码项目实战:驱动配置、连接字符串与数据迁移避坑 简介:一套用于小区物业管理的完整C/S架构软件源码,开发环境为VS2010与Access数据库。系统覆盖收费管理、住户管理、房间设置、单价设置、通知单打印以及Excel表格双向导入导出等常用业务,打印模块基于水晶报表构建,便于二次扩展。… · 2026/9/26 7:29:19
一次关于子查询的优化:用 TaoToken 统一 Key 打通 SQL 调优工作流 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 8:03:13
Codeg分屏视图实操指南:一个界面同时监控多个AI编程Agent的工作 Codeg分屏视图实操指南:一个界面同时监控多个AI编程Agent的工作 【免费下载链接】codeg Collaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docke… · 2026/9/26 8:03:13
脉脉xAMA活动深度测评:AI创作者的职场内容实战指南 最近脉脉上关于 xAMA 活动的讨论明显多了起来,不少 AI 创作者都在纠结要不要参加。我花了两周时间把脉脉平台的创作者生态、活动规则、流量分发逻辑完整测了一遍,并全程跟进了 xAMA 活动从报名到发布再到数据回收的整个流程。结论是:这个活动… · 2026/9/26 8:03:07
Claude Code模板体系:从CLAUDE.md到命令与Agent的完整实践 你有没有遇到过这种情况:连续让Claude Code做了几轮代码审查,它每次都要把项目背景重新“问”一遍;你让它写单元测试,它猜错了你的测试框架;你让它改个接口,它小心翼翼地不敢动其他文件、生怕破坏什么。这些… · 2026/9/26 8:03:07
Jev TypeSafe AI 决策系统架构解析与生产落地实践 1. 拆解 Jev 的核心命题:为什么“决策系统”需要一次架构级重写第一次看到“Jev”这个名字,加上“TypeSafe AI”“AI 决策系统”这几个关键词,我脑子里第一反应是:又一个把类型系统往 AI 上套的学术玩具?但把热词里那些… · 2026/9/26 8:03:06
从零搭建AI日报闹钟:定时抓取+DeepSeek生成+企业微信推送全链路 1. 为什么我要折腾一个“AI 日报闹钟”每天早上到工位,第一件事是打开各种信息源:项目群消息、待办清单、行业动态、昨天遗留的代码评审、今天要跟进的客户。信息是散的,人是懵的。我试过用待办软件、用笔记工具、用各种聚合阅读器࿰… · 2026/9/26 8:03:06
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46