这是一个普通的问题,我不知道它是如何处理的,我正在寻找好的(???)方法来做到这一点:
我有一个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相关联,你认为这是一个好主意吗?我怎么能以编程方式实现呢?
答案 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");
}
...
}