我正在开发一个程序,允许您与小型涡轮机的发动机控制单元进行通信。 ECU使用存储在EEPROM中的255个8位数进行配置(ECU通过RS232进行通信)。每个数字代表引擎的一个设置。 因此,为了理解这一点,我们有一个文件描述了所有这些设置的含义,并将其加载到我的程序中,每个设置生成一行15个标准QWidgets。 我还实施了一种对这些设置进行分类的方法,例如,所有与燃料消耗相关的设置都属于一个类别。有一个Qcombobox,您可以在其中选择要过滤的类别。点击它会调用以下函数:
void MainWindow::on_listCategories_currentTextChanged(const QString ¤tcategory) { //filter categories
//ui->checkBoxShowDifferences->setCheckState(Qt::Unchecked); //ugly hack!!
setUpdatesEnabled(false);
if(currentcategory == "ALL") {
for(int i=0; i<RegistrySettings.size(); i++) {
if(RegistrySettings[i].Policy < static_cast<int>(TMC_Program.CurrentActiveAccessPolicy)) {
hideOptionWidgets(RegistrySettings[i].address);
continue;
}
if(ui->checkBoxShowDifferences->isChecked()) {
if(RegistrySettings[i].value == RegistrySettings[i].compareValue) {
hideOptionWidgets(RegistrySettings[i].address);
continue;
}
}
showOptionWidgets(RegistrySettings[i].address);
}
} else {
for(int i=0; i<RegistrySettings.size(); i++) {
if(RegistrySettings[i].Policy < static_cast<int>(TMC_Program.CurrentActiveAccessPolicy)) {
hideOptionWidgets(RegistrySettings[i].address);
continue;
}
if(RegistrySettings[i].category != currentcategory) {
hideOptionWidgets(RegistrySettings[i].address);
continue;
}
if(ui->checkBoxShowDifferences->isChecked()) {
if(RegistrySettings[i].value == RegistrySettings[i].compareValue) {
hideOptionWidgets(RegistrySettings[i].address);
continue;
}
showOptionWidgets(RegistrySettings[i].address);
} else {
hideOptionWidgets(RegistrySettings[i].address);
}
}
}
setUpdatesEnabled(true);
虽然隐藏工作完全正常,但选择“全部”时需要显示所有隐藏的小部件,这非常慢!显示所有小部件大约需要5秒钟! 负责显示所有小部件的代码是:
void MainWindow::showOptionWidgets(int addr) {
if(addr < 0 || addr > 255) {return;}
QStringList WidgetNames = generateOptionRowWidgetNames(addr);
for(int i=1; i<WidgetNames.size(); i++) { //number 0 is a qhboxlayout and not a qwidget so it won't find it
QWidget* widgetToShow = ui->scrollAreaOptions->findChild<QWidget*>(WidgetNames[i]);
if(widgetToShow && widgetToShow->isHidden()) {
widgetToShow->show(); //extremely slow!
}
}
}
有没有办法对此进行优化?
注意:所有小部件都是标准小部件!只是标签,复选框和按钮,生成optionRowWidgetNames只生成一个简单的QStringlist,其中包含固定字符串,只附加了相应的设置编号。