热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QT学习之路十五(进程通信——系统剪切板和共享内存)

在Linux中,进程之间存在多种通信方式:管道通信、信号通信、共享内存、信号量、消息队列和套接字。系统剪切板以上这几种是经常在书本上或者百度上出现的方

  在Linux中,进程之间存在多种通信方式:管道通信、信号通信、共享内存、信号量、消息队列和套接字。

系统剪切板

  以上这几种是经常在书本上或者百度上出现的方式,最近在做一个截屏小程序的时候,发现其实还有其他的方法,那就是系统剪切板。

  截屏程序最关键的就是使用QPixmap的grabWindow方法,去抓取屏幕的winId,然后赋给一个QPixmap对象,将其显示即可。

this->pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
ui->show->setPixmap(this->pixmap.scaled(ui->show->size()));

上面pixmap是一个QPixmap的对象,show为一个QLabel对象,scaled方法可以使截得的图片按比例显示于Label中。


截完屏之后,便可以把得到的图片放入系统剪切板,

QClipboard *clipborad = QApplication::clipboard();
clipborad->setPixmap(this->pixmap);
在另一个进程中粘贴便实现了进程的通信。


这个截屏小程序中还运用到了文件保存对话框,右键菜单等功能,有兴趣的朋友可以去下载:http://pan.baidu.com/s/1mhRMmpi



共享内存
  共享内存的实现我使用了一个qt的dome,在帮助文档中搜索Shared Memory example,即可得到详细的介绍和源代码解释。

  共享内存和其他的方法其实都是类似的思想(除了套接字),就是先找一个缓冲区,将需要分享的东西存放于缓冲区,然后另一个进程去这个缓冲区寻找。

  在QT中,有一个现成的共享内存类QSharedMemory,在显示的时候,可以先利用QBuffer来存放缓冲的内容,然后再将QBuffer中的内容进行memcpy,放到共享内存中去。另一个进程读取的时候也是相同的步骤,只是反过来了而已。

  注意:每次访问共享内存的时候需要对共享内存进行上锁,访问结束后再解锁。

文件中加载图片放到共享内存:

void MainWindow::loadfileslot()
{//判断是否存在共享内存if(this->memory.isAttached()){this->memory.detach(); //清空共享内存}QString filename &#61; QFileDialog::getOpenFileName(this, "Open Image", QString(), tr("*.png *.bmp *jpg"));//加载QImage image;if(!image.load(filename)){QMessageBox::information(this, "Error Message", "Image Load Error");return;}ui->label->setPixmap(QPixmap::fromImage(image));//写入共享内存//QBuffer是一个文件读写界面&#xff0c;但是文件是在内存中的QBuffer buffer; //可以进行读写bool ok &#61; buffer.open(QIODevice::ReadWrite);if(ok){QDataStream in(&buffer);in<}




共享内存读取图片

//判断是否存在共享内存if(!this->memory.attach()){QMessageBox::information(this, "Error Message", "Unable to attach to shared memory segment");return;}QBuffer buffer;QDataStream in(&buffer);QImage image;memory.lock();buffer.setData((char*)memory.constData(), memory.size());buffer.open(QIODevice::ReadOnly);in >> image;memory.unlock();memory.detach();ui->label->setPixmap(QPixmap::fromImage(image));




共享内存的工程分享


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
author-avatar
HuPangpang_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有