【问题标题】:QCompleter setModel crashes applicationQCompleter setModel 使应用程序崩溃
【发布时间】:2019-12-12 10:38:30
【问题描述】:

我有表格小部件,其中一列需要文本自动补全。

每次用户请求新行时,我都会为该列运行此代码:

    else if (i == COLUMN_DESCRIPICION){
        QLineEdit *le = new QLineEdit(this);
        QStringList list = dbManager.getProductListStringsOnly();
        QCompleter *completer = new QCompleter(list,le);
        completer->setCaseSensitivity(Qt::CaseInsensitive);
        completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
        le->setCompleter(completer);
        ui->twReceiptItems->setCellWidget(rowindex,i,le);
    }

到目前为止一切顺利。现在用户可能需要向系统输入一个新项目。如果他这样做了,那么该项目也需要在现有行的列表中。所以要更新 QCompleter 单词列表,我运行这个:

void MainView::updateProductList(){

    if (ui->twReceiptItems->rowCount() == 0) return;

    QStringList list = dbManager.getProductListStringsOnly();

    for (qint32 i = 0; i < ui->twReceiptItems->rowCount(); i++){
        qDebug() << 1;
        QLineEdit *le = static_cast<QLineEdit*>(ui->twReceiptItems->cellWidget(i,COLUMN_DESCRIPICION));
        qDebug() << 2 << (le == nullptr);
        QCompleter *completer = le->completer();
        qDebug() << 3 << (completer == nullptr);
        QStringListModel *model = static_cast<QStringListModel*>(completer->model());
        qDebug() << 4 << (model == nullptr);
        if (model == nullptr) model = new QStringListModel();
        qDebug() << 5 << (model == nullptr);
        model->setStringList(list);
        qDebug() << 6;
        completer->setModel(model);
        qDebug() << 7;
        le->setCompleter(completer);
        qDebug() << 8;
    }

}

程序在 qDebug 第 6 行和第 7 行之间崩溃。但我不知道我做错了什么。

【问题讨论】:

  • 第 6 行和第 7 行在哪里???

标签: c++ qt


【解决方案1】:

您正在尝试使用指向当前模型的指针替换完成模型。当您调用setModel 时,会调用当前对象的delete,它恰好是您尝试设置为new 的对象。

在这里你设置一个指向当前模型的指针:

QStringListModel *model = static_cast<QStringListModel*>(completer->model());

在这里你把它放回去:

completer->setModel(model);

改用一个新的,即

completer->setModel(new QStringListModel(list));

或者,甚至更好

le.completer()->setModel(new QStringListModel(list));

只是一个脚注:不要使用static_cast 进行向上转换。 C++ 对此有一个特定的转换,dynamic_cast,Qt 甚至有用于 QObject 派生的qobject_cast

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2012-08-18
    • 2012-02-12
    • 2014-03-18
    • 2014-11-14
    • 2018-12-05
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多