zoukankan      html  css  js  c++  java
  • Qt 使用QSharedMemory方式实现数据跨界面传输

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

    原理是:

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

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

    运行截图如下:

    源码如下:

    sharedwidget.h

     1 #ifndef SHAREDWIDGET_H
     2 #define SHAREDWIDGET_H
     3  
     4 #include <QWidget>
     5  
     6 QT_BEGIN_NAMESPACE
     7 class QSharedMemory;
     8 QT_END_NAMESPACE
     9  
    10 namespace Ui {
    11 class SharedWidget;
    12 }
    13  
    14 class SharedWidget : public QWidget
    15 {
    16     Q_OBJECT
    17  
    18 public:
    19     explicit SharedWidget(QWidget *parent = 0);
    20     ~SharedWidget();
    21  
    22 protected slots:
    23     void LineEditTextChanged(QString text);
    24  
    25 private:
    26     Ui::SharedWidget *ui;
    27     QSharedMemory *m_sharedMemory;
    28 };
    29  
    30 #endif // SHAREDWIDGET_H

    widget.h

     1 #ifndef WIDGET_H
     2 #define WIDGET_H
     3  
     4 #include <QWidget>
     5  
     6 QT_BEGIN_NAMESPACE
     7 class QSharedMemory;
     8 QT_END_NAMESPACE
     9  
    10 namespace Ui {
    11 class Widget;
    12 }
    13  
    14 class Widget : public QWidget
    15 {
    16     Q_OBJECT
    17  
    18 public:
    19     explicit Widget(QWidget *parent = 0);
    20     ~Widget();
    21  
    22 protected:
    23     void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
    24  
    25 protected slots:
    26     void btnClicked();
    27  
    28 private:
    29     Ui::Widget *ui;
    30     QSharedMemory *m_sharedMemory;
    31     int m_timerId;
    32 };
    33  
    34 #endif // WIDGET_H

    main.cpp

     1 #include "widget.h"
     2 #include "sharedwidget.h"
     3 #include <QApplication>
     4  
     5 int main(int argc, char *argv[])
     6 {
     7     QApplication a(argc, argv);
     8  
     9     Widget w;
    10     w.show();
    11  
    12     return a.exec();
    13 }

    sharedwidget.h

     1 #include "sharedwidget.h"
     2 #include "ui_sharedwidget.h"
     3 #include <QSharedMemory>
     4 #include <QDataStream>
     5 #include <QBuffer>
     6 #include <QDebug>
     7  
     8 SharedWidget::SharedWidget(QWidget *parent) :
     9     QWidget(parent),
    10     ui(new Ui::SharedWidget)
    11 {
    12     ui->setupUi(this);
    13     m_sharedMemory = new QSharedMemory("123456");
    14     connect(ui->lineEdit, SIGNAL(textChanged(QString)),
    15             this, SLOT(LineEditTextChanged(QString)));
    16 }
    17  
    18 SharedWidget::~SharedWidget()
    19 {
    20     delete ui;
    21 }
    22  
    23  
    24 void SharedWidget::LineEditTextChanged(QString text)
    25 {
    26     if(m_sharedMemory->isAttached()){
    27         if(!m_sharedMemory->detach()){
    28             return;
    29         }
    30     }
    31  
    32     QBuffer buffer;
    33     buffer.open(QBuffer::ReadWrite);
    34     QDataStream out(&buffer);
    35     out << text;
    36  
    37     if(!m_sharedMemory->create(buffer.size())){
    38  
    39         qDebug()<< "create failed!";
    40         return;
    41     }
    42  
    43     m_sharedMemory->lock();
    44     char *to = static_cast<char*>(m_sharedMemory->data());
    45     const char *from =text.toStdString().c_str();
    46     memcpy(to, from, qMin(m_sharedMemory->size(), (int)buffer.size()));
    47     m_sharedMemory->unlock();
    48 }

    widget.cpp

     1 #include "widget.h"
     2 #include "ui_widget.h"
     3 #include "sharedwidget.h"
     4 #include <QDebug>
     5 #include <QBuffer>
     6 #include <QDataStream>
     7 #include <QSharedMemory>
     8  
     9 Widget::Widget(QWidget *parent) :
    10     QWidget(parent),
    11     ui(new Ui::Widget)
    12 {
    13     ui->setupUi(this);
    14  
    15     m_sharedMemory = new QSharedMemory;
    16     m_sharedMemory->setKey("123456");
    17  
    18     m_timerId = startTimer(0);
    19  
    20     connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(btnClicked()));
    21 }
    22  
    23 Widget::~Widget()
    24 {
    25     delete ui;
    26     delete m_sharedMemory;
    27 }
    28  
    29  
    30 void Widget::timerEvent(QTimerEvent *event)
    31 {
    32     if(event->timerId() == m_timerId){
    33  
    34         if(!m_sharedMemory->attach()){
    35  
    36             return;
    37         }
    38  
    39         QBuffer buffer;
    40         m_sharedMemory->lock();
    41         buffer.setData((char*)m_sharedMemory->constData(), m_sharedMemory->size());
    42         buffer.open(QBuffer::ReadOnly);
    43         QString data = buffer.readAll();
    44         m_sharedMemory->unlock();
    45         m_sharedMemory->detach();
    46         ui->label->setText(data);
    47  
    48     }
    49 }
    50  
    51 void Widget::btnClicked()
    52 {
    53     SharedWidget *sharedWidget = new SharedWidget;
    54     sharedWidget->show();
    55 }
  • 相关阅读:
    HttpServletRequest字符集问题
    原码反码补码
    无符号1byte转int
    初识spark的MLP模型
    冗余系统必要性
    shiro的rememberMe不生效
    阅读笔记-异常
    优雅的处理异常
    使用Maven搭建SpringMVC
    Jmeter发送soap请求
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14704256.html
Copyright © 2011-2022 走看看