私が理解している限り、あなたには2つのクラスがあります:MainWindow
とDialog
。保護されているためMainWindow::myPosReg
、にアクセスできるのは、から派生したDialog
場合、または友達である場合のみです。Dialog
MainWindow
次の設計が機能するはずです。
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
してDialog
、Dialog
値が変更されたことを通知するだけで、値がどこから来ているのかを気にせずにMainWindow
変更することです。myPosReg