赞
踩
1.TCP/IP
Qt Network提供了众多的类来实现网络编程。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
2.共享内存
QSharedMemory是跨平台的共享内存类,提供了访问操作系统共享内存的实现。它允许多个线程和进程安全地访问共享内存片段。此外,QSystemSemaphore可用于控制系统的共享资源的访问以及进程间通信。
3.D-Bus
D-Bus模块是一个Unix库,可以使用D-Bus协议来实现进程间通信。它将Qt的信号和槽机制扩展到了IPC层面,允许一个进程发射的信号关联到另一个进程的槽上。
4.QProcess
5.会话管理
在Linux/X11平台上,Qt提供了对会话管理的支持,回话允许时间传播到进程。例如,当关机时通知进程或程序,从而可以执行一些相关的操作。
dialog.h
- #ifndef DIALOG_H
- #define DIALOG_H
-
- #include <QDialog>
- #include <QSharedMemory>
-
- namespace Ui {
- class Dialog;
- }
-
- class Dialog : public QDialog
- {
- Q_OBJECT
-
- public:
- explicit Dialog(QWidget *parent = 0);
- ~Dialog();
-
- private:
- Ui::Dialog *ui;
- QSharedMemory sharedMemory;
-
- void detach();
-
- public slots:
- void loadFromFile();
- void loadFromMemory();
- private slots:
- void on_pushButtonLoadFromFile_clicked();
- void on_pushButtonLoadFromSharedMemory_clicked();
- };
-
- #endif // DIALOG_H
dialog.cpp
- #include "dialog.h"
- #include "ui_dialog.h"
- #include <QFileDialog>
- #include <QBuffer>
- #include <QDebug>
-
- Dialog::Dialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::Dialog)
- {
- ui->setupUi(this);
- //在共享内存以前,需要先为其制定一个key,系统用它来作为底层共享内存段的标识。这个key可以是任意的字符串
- sharedMemory.setKey("QSharedMemoryExample");
- }
-
- Dialog::~Dialog()
- {
- delete ui;
- }
-
- void Dialog::loadFromFile()
- {
- //判断该进程是否已经连接到共享内存段,如果是,就将该进程与共享内存段进行分离。
- if(sharedMemory.isAttached())
- detach();
-
- ui->label->setText(tr("选择一个图片文件!"));
- QString fileName = QFileDialog::getOpenFileName(0,QString(),QString(),tr("Images(*.png *.jpg)"));
- QImage image;
- if(!image.load(fileName))
- {
- ui->label->setText(tr("选择的文件不是图片,请选择图片文件"));
- return;
- }
- ui->label->setPixmap((QPixmap::fromImage(image)));
- //将图片加载到共享内存
- QBuffer buffer;
- //将图片暂存到buffer中
- buffer.open(QBuffer::ReadWrite);
- //获取图片数据的指针
- QDataStream out(&buffer);
- out<<image;
- //获取图片的大小
- int size = buffer.size();
- //创建指定大小的共享内存段
- if(!sharedMemory.create(size))
- {
- ui->label->setText(tr("无法创建共享内存段"));//
- return;
- }
- //在共享内存段的操作时,需要先加锁
- sharedMemory.lock();
- char * to = (char*)sharedMemory.data();
- const char * from = buffer.data().data();
- memcpy(to,from,qMin(sharedMemory.size(),size));
- //解锁
- sharedMemory.unlock();
-
- //如果将最后一个连接在共享内存段上的进程进行分离,那么系统会释放共享内存段。
- }
-
- void Dialog::loadFromMemory()
- {
- //将进程连接到共享内存段
- if(!sharedMemory.attach())
- {
- ui->label->setText(tr("无法连接到共享内存段,\n"
- "请先加载一张图片!"));
- return;
- }
- QBuffer buffer;
- QDataStream in(&buffer);
- QImage image;
- sharedMemory.lock();
- //读取内存段中的数据
- buffer.setData((char*)sharedMemory.constData(),sharedMemory.size());
- buffer.open(QBuffer::ReadOnly);
- in>>image;
- sharedMemory.unlock();
- sharedMemory.detach();
- ui->label->setPixmap(QPixmap::fromImage(image));
-
- }
- void Dialog::detach()
- {
- if(!sharedMemory.detach())
- {
- ui->label->setText(tr("无法从共享内存中分离"));
- }
- }
-
- void Dialog::on_pushButtonLoadFromFile_clicked()
- {
- loadFromFile();
- }
-
- void Dialog::on_pushButtonLoadFromSharedMemory_clicked()
- {
- loadFromMemory();
- }
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。