在qt5中显示很多小部件很慢

时间:2016-11-02 12:30:25

标签: c++ qt5 qwidget

我正在开发一个程序,允许您与小型涡轮机的发动机控制单元进行通信。 ECU使用存储在EEPROM中的255个8位数进行配置(ECU通过RS232进行通信)。每个数字代表引擎的一个设置。 因此,为了理解这一点,我们有一个文件描述了所有这些设置的含义,并将其加载到我的程序中,每个设置生成一行15个标准QWidgets。 我还实施了一种对这些设置进行分类的方法,例如,所有与燃料消耗相关的设置都属于一个类别。有一个Qcombobox,您可以在其中选择要过滤的类别。点击它会调用以下函数:

void MainWindow::on_listCategories_currentTextChanged(const QString &currentcategory) { //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,其中包含固定字符串,只附加了相应的设置编号。

0 个答案:

没有答案