1

Qt を使用して GUI インターフェイスを駆動する学校のプロジェクトがあります。さまざまなフォームのさまざまな .cpp ファイル間でクラス オブジェクトのベクトルを転送する最善の方法または最も簡単な方法を知る必要があります。.h ファイルを含めて、ベクトルを指す setPointer と getPointer を作成することを考えていましたが、より良い方法はありますか?

助けてくれてありがとう

4

9 に答える 9

4
  1. 2 つのフォームを使用しているとします。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. これで、書き込み時に formA がデータ (オブジェクトのセット) を共有しemit sendData(QVector() << objA << objB);、formB がそれをキャッチします!

シグナルとスロットの魔法をお楽しみください。:)

于 2013-08-15T21:25:06.667 に答える
1

カスタムのシグナルとスロットを使用する必要があります。メイン ウィンドウは、各フォーム間で信号とスロットを接続できます。

このように、フォームは互いに独立しています (つまり、ポインターは必要ありません)。

于 2013-04-05T12:14:34.923 に答える
0

externキーワードはどうですか?しかし、Qt のシグナル スロットは安全です。

于 2013-04-05T20:13:53.767 に答える
0

簡単な説明は次のとおりです。

次の 2 つの形式を取ります。

ダイアログ ウィンドウ ダッシュボードとセンサー

ダッシュボード:

#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 に答える
0

まず第一に、Qt コンテナー クラスは暗黙的に共有されます。つまり、それらを値で渡すことができ、浅いコピーのみが発生します。コンテナーを変更しようとすると、新しいコピーが作成されます。したがって、その特定のケースではポインターを使用する必要はありません。

次に、シグナルとスロットを使用して実際のデータ転送を行います。一般的なパターンは、親ウィジェットがその子ウィジェットを管理することであり、実際のデータの受け渡しは通常その親クラスで行われます。

于 2013-04-05T12:19:12.220 に答える
0

Qt クラス間でデータを転送する最良の方法は、シグナル/スロット システムを使用することです。

標準の C++ および Qt とは異なるタイプのデータを転送する場合は、そのタイプをqRegisterMetaTypeで登録する必要があることに注意してください。

于 2013-04-05T12:19:24.360 に答える
0

使用方法に応じて、少なくとも 2 つの方法があります。

まず、クラス (フォーム) にパブリック変数を作成し、そのクラスでアクセスできるように、ベクトル (ポインター) の現在の値を割り当てることができます。

もう 1 つのオプションは、アプリケーションでシングルトン クラスを作成し、そのクラス内にベクトル ポインターを格納することです。これにより、アプリケーション全体でこのクラスへのアクセスが許可されます。

要件に基づいて、ベクトルをアプリケーションの存続期間中存続させたい場合は、2 番目のオプションを選択する必要があります。それ以外の場合は、最初のオプションを選択します。

于 2013-04-05T13:07:36.910 に答える