在Qt中的表单之间传输数据

时间:2013-04-05 12:06:14

标签: c++ qt

我有一个学校项目,我使用Qt来驱动我的GUI界面。我需要知道在不同的.cpp文件之间为不同的表单传递类对象的向量的最佳方法或最简单的方法。我想要包含.h文件并创建一个指向向量的setPointer和getPointer,但是有更好的方法吗?

感谢您的帮助

9 个答案:

答案 0 :(得分:4)

  1. 我们假设你使用两种形式。 formAformB
  2. forma.cpp

    中创建信号和广告位

    公共位置: void receiveData(QVectorobjects);

    信号: void sendData(QVector);

    formb.cpp执行相同操作。

  3. 现在像这样连接formA和formB。

    connect(formA, SIGNAL(sendData(QVector<MyClass>)), formB, SLOT((receiveData(QVector<MyClass>)));

    connect(formA, SIGNAL(receiveData(QVector<MyClass>)), formB, SLOT((MyClass(QVector<MyClass>)));

  4. 现在,当您编写emit sendData(QVector() << objA << objB);并且formB将捕获它时,formA将共享数据(对象集)!

  5. 享受信号和插槽的魔力。 :)

答案 1 :(得分:1)

您应该使用自定义信号和插槽。 您的主窗口可以连接每个表单之间的信号和插槽。

通过这种方式,表单彼此独立(即不需要指针)。

答案 2 :(得分:0)

首先,隐式共享Qt容器类,这意味着您可以按值传递它们,并且只会出现浅拷贝。如果您尝试修改容器,则将创建新副本。所以在这种特殊情况下不需要使用指针。

然后,使用信号和插槽来进行实际的数据传输 - 常用模式是父窗口小部件管理其子窗口小部件,而父类通常是实际传递数据。

答案 3 :(得分:0)

在Qt类之间传输数据的最佳方法是使用signal/slot system

请注意,如果要传输类型与标准C ++和Qt不同的数据,则应使用qRegisterMetaType

注册其类型

答案 4 :(得分:0)

根据您的使用情况,至少有两种方式。

首先在类(表单)中创建一个公共变量,您可以为其分配向量(指针)的当前值,以便您可以在该类中访问它。

另一种选择是在应用程序中创建一个单例类,并将向量指针存储在该类中。这将允许在整个应用程序中访问此类。

根据您的要求,如果您希望矢量在应用程序生命周期内保持活动状态,则应选择第二个选项,否则选择第一个选项。

答案 5 :(得分:0)

extern关键字怎么样?但Qt的信号槽是安全的。

答案 6 :(得分:0)

使用QVectorQList或任意数量的Qt's container classes。您可以将迭代器传递给表单,或者将引用(QList :: operator [])传递给表单,这样就不会复制数据。

如果要传递整个矢量,请将其作为参考传递。例如:

//pass the whole vector as for read-write
void doStuffOnMany(QList<MyClass>& listref) {}  //declaration
...
QList<MyClass> mylist;                          //usage
doStuffOnMany(mylist);

//read-only
void doStuffOnMany(const QList<MyClass>& listref) {}

//pass one portion of the vector for read-write
void doStuffOnOne(MyClass& classref) {}         //declaration
...
QList<MyClass> mylist;                          //usage
doStuffOnOne(mylist[0]);

此外,Qt容器类是隐式共享的,因此如果您需要良好的性能,甚至不必传递对向量的引用。

答案 7 :(得分:0)

我最终使用了extern关键字。我查看了自定义信号和插槽,我认为这将是更好的方式,但是考虑到时间和事实,这是为了学校,我现在用快速和肮脏的方式。

答案 8 :(得分:0)

这是一个简单的解释:

采取两种形式:

对话窗口 仪表板和传感器

仪表板上的

#ifndef DASHBOARD_H
#define DASHBOARD_H

#include "sensor.h"
#include <QDialog>

namespace Ui {
class dashboard;
}

class dashboard : public QDialog
{
    Q_OBJECT

public:
    explicit dashboard(QWidget *parent = 0);

    QTimer *timer;

    ~dashboard();

public slots:
    void MyTimerSlot();


private slots:
    void on_pushButton_clicked();

private:
    Ui::dashboard *ui;
    double mTotal;
    sensor *snsr;
};

#include "dashboard.h"
#include "ui_dashboard.h"
#include <QDebug>
#include <QTimer>
#include <QMessageBox>

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

    this->setWindowTitle(QString("dashboard"));
    // create a timer
    timer = new QTimer(this);

    // setup signal and slot
    connect(timer, SIGNAL(timeout()),
          this, SLOT(MyTimerSlot()));

    timer->stop();

    mTotal = 0;
    snsr = new sensor(this);
    // msecx
}

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

void dashboard::on_pushButton_clicked()
{
    snsr->show();
}

void dashboard::MyTimerSlot()
{
    mTotal += 1;
    snsr->setValue(mTotal);
    ui->sensorlabel->setText(QString::number(mTotal));
}

现在在传感器上:sensor.h

#ifndef SENSOR_H
#define SENSOR_H
#include <QTimer>

#include <QDialog>

namespace Ui {
class sensor;
}

class sensor : public QDialog
{
    Q_OBJECT

public:
    explicit sensor(QWidget *parent = 0);

    ~sensor();

public slots:
    void setValue(double value);

signals:
    void changeLabel();
    void valueChanged(double newValue);

private:
    Ui::sensor *ui;
    double mTotal;
};

#endif // SENSOR_H

sensor.cpp

#include "sensor.h"
#include "ui_sensor.h"
#include "dashboard.h"

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

    this->setWindowTitle(QString("sensor"));

    connect(this, SIGNAL(valueChanged(double)), this, SLOT(changeLabel()));
}


void sensor::changeLabel()
{
    ui->sensorlabel->setText(QString::number(mTotal));
}

void sensor::setValue(double value)
{
    if (value != mTotal) {
        mTotal = value;
        emit changeLabel();
    }
}

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