Qt を使用して GUI インターフェイスを駆動する学校のプロジェクトがあります。さまざまなフォームのさまざまな .cpp ファイル間でクラス オブジェクトのベクトルを転送する最善の方法または最も簡単な方法を知る必要があります。.h ファイルを含めて、ベクトルを指す setPointer と getPointer を作成することを考えていましたが、より良い方法はありますか?
助けてくれてありがとう
formA
とformB
。信号を作成して挿入するforma.cpp
パブリック スロット: void receiveData(QVectorobjects);
シグナル: void sendData(QVector);
についても同じことを行いformb.cpp
ます。
formA と formB をこのように接続します。
connect(formA, SIGNAL(sendData(QVector<MyClass>)), formB, SLOT((receiveData(QVector<MyClass>)));
connect(formA, SIGNAL(receiveData(QVector<MyClass>)), formB, SLOT((MyClass(QVector<MyClass>)));
これで、書き込み時に formA がデータ (オブジェクトのセット) を共有しemit sendData(QVector() << objA << objB);
、formB がそれをキャッチします!
シグナルとスロットの魔法をお楽しみください。:)
カスタムのシグナルとスロットを使用する必要があります。メイン ウィンドウは、各フォーム間で信号とスロットを接続できます。
このように、フォームは互いに独立しています (つまり、ポインターは必要ありません)。
extern
キーワードはどうですか?しかし、Qt のシグナル スロットは安全です。
簡単な説明は次のとおりです。
次の 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;
}
まず第一に、Qt コンテナー クラスは暗黙的に共有されます。つまり、それらを値で渡すことができ、浅いコピーのみが発生します。コンテナーを変更しようとすると、新しいコピーが作成されます。したがって、その特定のケースではポインターを使用する必要はありません。
次に、シグナルとスロットを使用して実際のデータ転送を行います。一般的なパターンは、親ウィジェットがその子ウィジェットを管理することであり、実際のデータの受け渡しは通常その親クラスで行われます。
Qt クラス間でデータを転送する最良の方法は、シグナル/スロット システムを使用することです。
標準の C++ および Qt とは異なるタイプのデータを転送する場合は、そのタイプをqRegisterMetaTypeで登録する必要があることに注意してください。
使用方法に応じて、少なくとも 2 つの方法があります。
まず、クラス (フォーム) にパブリック変数を作成し、そのクラスでアクセスできるように、ベクトル (ポインター) の現在の値を割り当てることができます。
もう 1 つのオプションは、アプリケーションでシングルトン クラスを作成し、そのクラス内にベクトル ポインターを格納することです。これにより、アプリケーション全体でこのクラスへのアクセスが許可されます。
要件に基づいて、ベクトルをアプリケーションの存続期間中存続させたい場合は、2 番目のオプションを選択する必要があります。それ以外の場合は、最初のオプションを選択します。