关于QSharedMemory相关的知识点在下面这个链接中!

https://blog.csdn.net/qq78442761/article/details/81738155

 

这里使用QSharedMemory可以实现信号与槽中跨界面传输数据的功能!

 

原理是:

发送界面获取到数据就写到SharedMemory中

而获取端,用个记时器,时时去多,奇淫技巧啊!

 

运行截图如下:

\"\"

源码如下:

sharedwidget.h

#ifndef SHAREDWIDGET_H
#define SHAREDWIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QSharedMemory;
QT_END_NAMESPACE

namespace Ui {
class SharedWidget;
}

class SharedWidget : public QWidget
{
    Q_ 

public:
    explicit SharedWidget(QWidget *parent = 0);
    ~SharedWidget();

protected slots:
    void LineEditTextChanged(QString text);

private:
    Ui::SharedWidget *ui;
    QSharedMemory *m_sharedMemory;
};

#endif // SHAREDWIDGET_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QSharedMemory;
QT_END_NAMESPACE

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_ 

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;

protected slots:
    void btnClicked();

private:
    Ui::Widget *ui;
    QSharedMemory *m_sharedMemory;
    int m_timerId;
};

#endif // WIDGET_H

main.cpp

#include \"widget.h\"
#include \"sharedwidget.h\"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Widget w;
    w.show();

    return a.exec();
}

sharedwidget.h

#include \"sharedwidget.h\"
#include \"ui_sharedwidget.h\"
#include <QSharedMemory>
#include <QDataStream>
#include <QBuffer>
#include <QDebug>

SharedWidget::SharedWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SharedWidget)
{
    ui->setupUi(this);
    m_sharedMemory = new QSharedMemory(\"123456\");
    connect(ui->lineEdit, SIGNAL(textChanged(QString)),
            this, SLOT(LineEditTextChanged(QString)));
}

SharedWidget::~SharedWidget()
{
    delete ui;
}


void SharedWidget::LineEditTextChanged(QString text)
{
    if(m_sharedMemory->isAttached()){
        if(!m_sharedMemory->detach()){
            return;
        }
    }

    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);
    out << text;

    if(!m_sharedMemory->create(buffer.size())){

        qDebug()<< \"create failed!\";
        return;
    }

    m_sharedMemory->lock();
    char *to = static_cast<char*>(m_sharedMemory->data());
    const char *from =text.toStdString().c_str();
    memcpy(to, from, qMin(m_sharedMemory->size(), (int)buffer.size()));
    m_sharedMemory->unlock();
}

widget.cpp

#include \"widget.h\"
#include \"ui_widget.h\"
#include \"sharedwidget.h\"
#include <QDebug>
#include <QBuffer>
#include <QDataStream>
#include <QSharedMemory>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_sharedMemory = new QSharedMemory;
    m_sharedMemory->setKey(\"123456\");

    m_timerId = startTimer(0);

    connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(btnClicked()));
}

Widget::~Widget()
{
    delete ui;
    delete m_sharedMemory;
}


void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == m_timerId){

        if(!m_sharedMemory->attach()){

            return;
        }

        QBuffer buffer;
        m_sharedMemory->lock();
        buffer.setData((char*)m_sharedMemory->constData(), m_sharedMemory->size());
        buffer.open(QBuffer::ReadOnly);
        QString data = buffer.readAll();
        m_sharedMemory->unlock();
        m_sharedMemory->detach();
        ui->label->setText(data);

    }
}

void Widget::btnClicked()
{
    SharedWidget *sharedWidget = new SharedWidget;
    sharedWidget->show();
}

 

收藏 打印