0

我有两个窗口:mainwindow.uidialog.ui。在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.cpp用于dialog.ui还是可以在mainwindow.cpp中使用dialog.ui -date ?要在dialog.ui中设置值,我使用 QDoubleSpinBox。在mainwindow.ui我调用dialog.ui。对不起我的英语。

4

1 回答 1

0

据我了解,您有两个类:MainWindowDialog. 由于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并且DialogDialog仅表示值已更改,但不关心它们会发生什么,并MainWindow更改它myPosReg但不关心值的来源。

于 2012-09-01T20:52:42.000 回答