1

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

谢谢您的帮助

4

9 回答 9

4
  1. 假设您使用两种形式。formAformB
  2. 创建一个信号和插槽forma.cpp

    公共插槽:void receiveData(QVectorobjects);

    信号:无效发送数据(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. 现在 formA 将在您编写时共享数据(对象集),emit sendData(QVector() << objA << objB);而 formB 将捕获它!

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

于 2013-08-15T21:25:06.667 回答
1

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

这样,您的表单彼此独立(即不需要指针)。

于 2013-04-05T12:14:34.923 回答
0

Depending upon your usage, there can be at least two ways.

First is to create a public variable in your class (form) to which you can assign the current value of the vector (pointer) so that you can access it in that class.

Another option is to create a singleton class in the application and store the vector pointer inside that class. This will allow access to this class throughout the application.

Based on your requirement, if you want the vector to stay alive for the application life, you should opt the second option, otherwise opt the first option.

于 2013-04-05T13:07:36.910 回答
0

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

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

于 2013-04-05T12:19:12.220 回答
0

在 Qt 类之间传输数据的最佳方式是使用信号/槽系统

请注意,如果您要传输类型不同于标准 C++ 和 Qt 的数据,您应该使用qRegisterMetaType注册它的类型

于 2013-04-05T12:19:24.360 回答
0

extern关键字呢?但是Qt的信号槽是安全的。

于 2013-04-05T20:13:53.767 回答
0

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

于 2013-04-25T18:55:00.657 回答
0

使用QVectorQList或任意数量的Qt 容器类。您可以将迭代器传递给表单,或将引用 (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 容器类是隐式共享的,因此如果您需要良好的性能,您甚至不必传递对向量的引用。

于 2013-04-05T21:04:18.473 回答
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

传感器.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;
}
于 2015-05-28T00:59:03.480 回答