QCompleter set模型使应用程序崩溃

QCompleter setModel crashes application

本文关键字:应用程序 崩溃 模型 set QCompleter      更新时间:2023-10-16

我有表格小部件,其中一列需要具有文本自动填充。

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

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 行之间崩溃。但我无法弄清楚我做错了什么。

您正在尝试使用指向其当前模型的指针替换完成器模型。当您调用setModel时,将调用当前对象的删除,并且它恰好与您尝试设置为对象的同一对象。

在这里,您可以设置指向当前模型的指针:

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_castQObject衍生物。