将QComboBox模型设置为none

时间:2016-11-14 14:30:21

标签: qt qcombobox qabstractitemmodel

构建QComboBox()时,模型最初是“空的”(即没有附加模型)。在使用QComboBox::setModel()指定模型后,会附加模型。现在,我需要将QComboBox模型重置为先前的状态:“empty”或“none”。

我有一个名为QCheckBox的{​​{1}}和名为chbW1的QComboBox。在检查cbWaehrung1之前,未附加任何模型且QCheckBox为空。如果选中QComboBox,我会将QCheckBox的模型设置为QComboBox。这部分有效。

现在,如果我取消选中wmodel,我希望QCheckBox返回上一个状态(空)。但它只会被禁用(通过代码,见下文),保留其索引和文本。如果我再次打开它(检查QComboBox),旧值(索引和文本)仍然存在。

这是Qt 5.6 - “其他”部分似乎不起作用:

QCheckbox

我也试过像

这样的东西
void MainWindow::on_chbW1_toggled(bool checked)
{
    ui->cbWaehrung1->setEnabled(checked);
    if (checked) {
        // working
        ui->cbWaehrung1->setModel(this->wmodel);
        ui->cbWaehrung1->setModelColumn(1);
        ui->cbWaehrung1->setFocus();
    } else {
        // not working
        ui->cbWaehrung1->clear();
        ui->cbWaehrung1->clearEditText();
    }
}

但这会在编译时出错:

ui->cbWaehrung1->setModel(QAbstractItemModel());

此外:

invalid cast to abstract class type ‘QAbstractItemModel’
         ui->cbWaehrung2->setModel(QAbstractItemModel());
                                                      ^

这会在运行时产生错误:

  

无法设置0模型

如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用空模型,但请记住setModel()指向模型的指针,而QAbstractItemModel(不出所料)是抽象的:

auto *emptyModel = new QStandardItemModel(ui->cbWaehrung2);
ui->cbWaehrung2->setModel(emptyModel);

我们将QComboBox设置为空模型的父级;这意味着它需要所有权,并在调用setModel()时删除模型以设置新模型。

如果您不想在每次调用函数时创建新的emptyModel,则可能希望安排重新使用或删除static QStandardItemModel emptyModel; ui->cbWaehrung2->setModel(&emptyModel); 。最简单的方法可能是拥有一个静态空模型,只需传递指向该模型的指针:

0xc1