热门标签 | 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));




共享内存的工程分享


推荐阅读
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
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社区 版权所有