mainwindow.ui和dialog.ui设置/读取通信日期

时间:2012-08-31 19:39:44

标签: c++ qt c++11

我有两个窗口: 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 。 对不起我的英语。

1 个答案:

答案 0 :(得分:0)

据我了解,您有两个类:MainWindowDialog。由于MainWindow::myPosReg受到保护,您只能Dialog访问DialogMainWindow来自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

优势在于您将DialogDialogMainWindow分离,只是表示值已更改但不关心它们发生了什么,而myPosReg更改了{ {1}}但不在乎,价值来自哪里。