gpt4 book ai didi

c++ - QCompleter setModel使应用程序崩溃

转载 作者:行者123 更新时间:2023-12-02 10:22:55 24 4
gpt4 key购买 nike

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

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

    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派生提供了 qobject_cast

关于c++ - QCompleter setModel使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59302691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com