Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Qt GUI调整/观察算法参数的最佳方法_C++_Algorithm_Qt_User Interface - Fatal编程技术网

C++ 使用Qt GUI调整/观察算法参数的最佳方法

C++ 使用Qt GUI调整/观察算法参数的最佳方法,c++,algorithm,qt,user-interface,C++,Algorithm,Qt,User Interface,我有两个算法类,它们进行不同的计算。所有这些类都有不同的参数集。我想要实现的是创建一个QtGUI,它充当算法参数的观察者,让我们使用它进行更改(参数的某种MVC)。可以为每个算法类手动创建所需的小部件(例如使用Qt Designer)。另一个要求是保持alorithms Qt空闲,尽管它们有自己的信号/插槽机制 目前,只要值发生变化,算法就会触发一个信号,第三方会将其转换为Qt信号,然后UI会相应地更新。每当UI小部件更改插槽时,都会在算法中设置适当的参数(在执行范围检查、转换等操作时)。目前,

我有两个算法类,它们进行不同的计算。所有这些类都有不同的参数集。我想要实现的是创建一个QtGUI,它充当算法参数的观察者,让我们使用它进行更改(参数的某种MVC)。可以为每个算法类手动创建所需的小部件(例如使用Qt Designer)。另一个要求是保持alorithms Qt空闲,尽管它们有自己的信号/插槽机制

目前,只要值发生变化,算法就会触发一个信号,第三方会将其转换为Qt信号,然后UI会相应地更新。每当UI小部件更改插槽时,都会在算法中设置适当的参数(在执行范围检查、转换等操作时)。目前,属于某个算法类的所有小部件都调用一个统一的插槽,该插槽检查属于该类的所有小部件(以减少所需的插槽数量)

非常基本的例子:

GUI类

connect( m_notifier, SIGNAL( algo1ChangedParameters() ), this, SLOT( updateWidgets ) );

connect( m_my_spinbox_1, SIGNAL( valueChanged(int) ), this, SLOT( handleAlgo1ParameterChange() ) );
connect( m_my_spinbox_2, SIGNAL( valueChanged(int) ), this, SLOT( handleAlgo1ParameterChange() ) );

void handleAlgo1ParameterChange()
{
    Algo1Parameters p = m_algo1.GetParameters();

    p.param1 = /*spinbox 1 value*/;
    p.param2 = /*spinbox 1 value*/;

    m_algo1.SetParameters( p );
}

void updateWidgets()
{
    Algo1Parameters p = m_algo1.GetParameters();
    /* set spinboxes to values in p */
}
在这种情况下,m_通知程序将在算法和Qt信号之间进行转换

我的问题:

  • 是否有更好的/标准的方法来实现这种算法GUI(例如,使用某种Qt小部件值映射或类似方法进行范围检查和转换)
  • 如果GUI是自动创建的,是否有通过访问者模式实现GUI创建的标准方法

谢谢

您可以使用Qt模型视图框架执行此任务。您可以创建新的模型类并实现其虚拟方法和信号(包括
data()
setData()
方法和
dataChanged
信号)。您可以使用
QDataWidgetMapper
将自旋框附加到模型。Spinbox将自动反映模型数据更改。用户所做的更改将自动重定向到模型的
setData
功能。在模型实现中,您可以实现所有必要的数据处理逻辑(包括范围检查)


但是,这种方法很容易导致过度复杂,所以请小心使用。

一些简单的显式代码提供了一个基本示例