我怎么能/应该在Qt中创建ui表单和数据成员之间的自动链接?

时间:2014-04-24 07:24:03

标签: c++ qt

这是一个普通的问题,我不知道它是如何处理的,我正在寻找好的(???)方法来做到这一点:

我有一个ui,其中包含许多与我的程序的各种选项相对应的数字形式。 我有几个使用ui提供的数据的结构。

我需要明确地同步表单和数据。现在我手动完成这个功能:

Options GetOptions(){ //fetches data from ui and stores it in my structure
        options.fil.alpha = ui.fil_consecutive_alpha->value();
        options.fil.beta = ui.fil_consecutive_beta->value();
        options.fil.gamma = ui.fil_consecutive_gamma->value();
        options.fil.delta = ui.fil_consecutive_delta->value();
        options.fil.k_max = ui.fil_consecutive_k_max->value();
        options.fil.radius = ui.fil_consecutive_radius->value();
        options.fil.omega = ui.fil_consecutive_omega->value();
        options.fil.side_length = ui.fil_consecutive_side_length->value();
        options.fil.norm = ui.fil_consecutive_norm->value();
        options.fil.consecutive_images = true;
}
void SetOptions(const Options& options){ //update ui forms with the loaded options sdtored in the structure
        ui.fil_consecutive_alpha->setValue(options.fil.alpha);
        ui.fil_consecutive_beta->setValue(options.fil.beta );
        ui.fil_consecutive_gamma->setValue(options.fil.gamma);
        ui.fil_consecutive_delta->setValue(options.fil.delta);
        ui.fil_consecutive_k_max->setValue(options.fil.k_max);
        ui.fil_consecutive_radius->setValue(options.fil.radius);
        ui.fil_consecutive_omega->setValue(options.fil.omega);
        ui.fil_consecutive_side_length->setValue(options.fil.side_length);
        ui.fil_consecutive_norm->setValue(options.fil.norm);
    }

每次添加ui字段时,我都必须更新集合并获取函数。这些功能看起来很愚蠢,随着时间的推移越来越糟,我被告知计算机擅长处理这种重复的哑巴任务。

那么,你认为以某种方式说每个以“fil_consecutive_”开头的ui形式都应该与结构options.fil相关联,你认为这是一个好主意吗?我怎么能以编程方式实现呢?

1 个答案:

答案 0 :(得分:2)

我会试着给你一个主意。您可以将objectName设置为您的表单。如果在Designer中设置将在生成的ui.hh文件中完成的ObjectName。使用QList存储所有特定表单和QMap for Options。

...
// set form's name somewhere
ui.fil_consecutive_alpha->setObjectName("fil_consecutive_omega");
...

...
// colect forms like this
QObjectList list = this.children();
QObjectList forms = QObjectList();
for (int i = 0; i < list.size(); ++i) {
    if list[i].objectName().startsWith("fil_consecutive_")
         forms << list[i];
...

...
// then your function will be
void getOptions(QObjectList forms){
    ...
    for (int i = 0; i < forms.size(); ++i) {
         QString opt = forms[i].objectName().mid(QString("fil_consecurive_").length())
         options.fil[opt] = forms[i].property("value");
    }
    ...
}