据我了解,您有两个类: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());
}
};
所以对话框有一个内部 slot onSpinBoxValueChanged()
,当其中一个 spinbox 更改其值时会调用它。这个槽的唯一目的是发出另一个信号valuesChanged
,我们将连接主窗口(即对话框的内部槽将三个值组合成一个信号)。
主窗口可能如下:
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
但不关心值的来源。