我有两个窗口: mainwindow.ui 和 dialog.ui 。在 mainwindow.cpp 中,我初始化另一个类的堆上的一些对象以进行以太网通信,并使用这些对象的函数从总线读取日期并在 mainwindow.ui中显示值即可。在 dialog.ui 中,我想在总线上设置值,但问题是访问 mainwindow.cpp 中的通信功能和对象。 我想将dialog.cpp定义为朋友类,但我做错了。这是一些代码:
mainwindow.h
class MainWindow : public QMainWindow
{protected: DateReg *myPosReg;...}
mainwindow.cpp
...
myPosReg = new DateReg(DateValue->AddReg());
...
myPosReg->GetValue(a,b,c);
myPosReg->setValue(a,b,c);
...
我可以在 dialog.cpp 中以某种方式访问 setValue()函数吗?我应该总是使用 dialog.cpp 作为 dialog.ui ,或者在主窗口中使用 dialog.ui -date的.cpp ?要在 dialog.ui 中设置值,我使用QDoubleSpinBox。 在 mainwindow.ui 中,我调用 dialog.ui 。 对不起我的英语。
答案 0 :(得分:0)
据我了解,您有两个类: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([...]);
}
};
或是朋友。
以下设计应该有效:
Dialog
作为替代方案,我建议使用信号和插槽来实现更多Qt-ish方式。当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()
因此对话框有一个内部插槽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
更改了{ {1}}但不在乎,价值来自哪里。