#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox> // 引入QMessageBox头文件,用于提供用户交互对话框,增强程序的用户体验
// Widget类构造函数,负责初始化用户界面和共享内存
Widget::Widget(QWidget *parent)
: QWidget(parent) // 调用基类QWidget的构造函数
, ui(new Ui::Widget) // 初始化用户界面对象
{
ui->setupUi(this); // 调用setupUi方法来布局和初始化用户界面
// 创建一个QSharedMemory对象,用于管理共享内存
shareMemory = new QSharedMemory(this);
shareMemory->setKey("mengfan"); // 设置共享内存的键,用于跨进程识别共享内存段
// 尝试附加到一个已存在的共享内存段
if (!shareMemory->attach())
{
// 如果附加失败,通过QMessageBox弹出一个错误对话框,提示用户无法附加到共享内存
QMessageBox::critical(this, "共享内存错误", "无法附加到共享内存。");
return; // 退出构造函数,避免继续执行可能导致的错误
}
}
// Widget类析构函数,负责清理资源
Widget::~Widget()
{
// 检查共享内存是否已附加,如果是,则断开连接以避免资源泄露
if (shareMemory->isAttached())
shareMemory->detach();
// 删除QSharedMemory对象和用户界面对象,释放内存
delete shareMemory;
delete ui;
}
// 槽函数,响应界面上"读取共享内存"按钮的点击事件
void Widget::on_shareMemoryRead_clicked()
{
// 首先检查共享内存是否已成功附加
if (!shareMemory->isAttached())
{
// 如果没有附加,弹出一个信息对话框告知用户
QMessageBox::information(this, "警告", "共享内存未附加。");
return; // 中断执行,不继续读取操作
}
// 安全地转换共享内存的原始数据指针为char指针
char *pData = static_cast<char*>(shareMemory->data());
// 确保数据指针有效
if (pData)
{
// 获取共享内存中的数据大小,确保只读取有效数据范围
int dataSize = shareMemory->size();
// 使用QByteArray从共享内存构造数据缓冲区,便于处理
QByteArray dataBuffer(pData, dataSize);
// 假设共享内存中存储的是UTF-8编码的文本,将其转换为QString以便显示
QString sharedText = QString::fromUtf8(dataBuffer);
// 将读取到的文本数据显示在textEdit控件上
ui->textEdit->setText(sharedText);
}
else
{
// 数据指针无效时,向用户显示信息表示共享内存数据不可读
ui->textEdit->setText("共享内存数据不可读。");
}
}