0

mainwindow.uidialog.uiの 2 つのウィンドウがあります。mainwindow.cppでは、イーサネット通信用に別のクラスのヒープでいくつかのオブジェクトを初期化し、これらのオブジェクトの関数を使用してバスから日付を読み取り、値をmainwindow.uiに表示します。dialog.uiでバスに値を設定したいのですが、問題はmainwindow.cppの通信関数とオブジェクトにアクセスすることです。dialog.cpp をフレンド クラスとして定義したかったのですが、何か問題があります。ここにいくつかのコードがあります:

メインウィンドウ.h

class MainWindow : public QMainWindow 
{protected: DateReg *myPosReg;...}

メインウィンドウ.cpp

...   
myPosReg = new DateReg(DateValue->AddReg());
...
myPosReg->GetValue(a,b,c);
myPosReg->setValue(a,b,c);
    ...

dialog.cppのsetValue()関数に何らかの方法でアクセスできますか? dialog.uiには常に dialog.cpp を使用する必要がありますか、またはmainwindow.cppでdialog.ui -date を使用する可能性がありますか? dialog.uiで値を設定するには、QDoubleSpinBoxを使用します。mainwindow.ui で、dialog.uiを呼び出します。私の英語ですみません。

4

1 に答える 1

0

私が理解している限り、あなたには2つのクラスがあります:MainWindowDialog。保護されているためMainWindow::myPosReg、にアクセスできるのは、から派生したDialog場合、または友達である場合のみです。DialogMainWindow

次の設計が機能するはずです。

class MainWindow : public QMainWindow 
{
    [...]
  protected: 
    DateReg *myPosReg; 
    friend class Dialog; 
};

class Dialog
{
    [...]
    MainWindow* myMainWindow;

    void someFunction()
    {
        myMainWindow->myPosReg->setValue([...]);
    }
};

別の方法として、シグナルとスロットを使用して、よりQtっぽい方法を提案します。スピンボックスが変化すると、リッスンDialogする信号を発します。MainWindow

ダイアログから始めます。

class Dialog : public QDialog
{
    [...]
    Dialog()
    {
        [...init ui...]
        connect(ui->spinBoxA, SIGNAL(valueChanged(int)),
                this, SLOT(onSpinBoxValueChanged()));
        connect(ui->spinBoxB, SIGNAL(valueChanged(int)),
                this, SLOT(onSpinBoxValueChanged()));
        connect(ui->spinBoxC, SIGNAL(valueChanged(int)),
                this, SLOT(onSpinBoxValueChanged()));
    }

  signals:
    void valuesChanged(int a, int b, int c);

  private slots:
    void onSpinBoxValueChanged()
    {
        emit valuesChanged(ui->spinBoxA->value(), ui->spinBoxB->value(),
                           ui->spinBoxC->value());
    }
};

したがって、ダイアログには内部スロットonSpinBoxValueChanged()があり、スピンボックスの1つがその値を変更したときに呼び出されます。このスロットの唯一の目的はvaluesChanged、メインウィンドウに接続する別の信号を送信することです(つまり、ダイアログの内部スロットは3つの値を1つの信号に結合します)。

メインウィンドウは次のようになります。

class MainWindow : public QMainWindow
{
    [...]
    DateReg *myPosReg;
  public slots:
    void setValues(int a, int b, int c)
    {
        myPosReg->setValues(a, b, c);
    }
};

そして、両方を接続するコード

int main()
{
    [...]
    MainWindow* mainWindow = new MainWindow;
    Dialog* dialog = new Dialog;
    connect(dialog, SIGNAL(valuesChanged(int,int,int)),
            mainWindow, SLOT(setValues(int,int,int)));
}

ユーザーがスピンボックスの値を変更すると、次の連鎖反応が発生します。

QSpinBox::valueChanged(int) -> Dialog::onSpinBoxValueChanged() 
  -> Dialog::valuesChanged() -> MainWindow::setValues() -> DateReg::setValues()

利点は、分離MainWindowしてDialogDialog値が変更されたことを通知するだけで、値がどこから来ているのかを気にせずにMainWindow変更することです。myPosReg

于 2012-09-01T20:52:42.000 に答える