我有q方法,如下所示:
void MainWindow::slotResults( const QList<QSqlRecord>& records )
{
ui->lineEditWord->setCompleter(0);
QStringList wordList;
for(int i = 0; i < records.count(); i++)
{
wordList.append( QString("%1").arg( records.value(i).value(0).toString()));
}
QCompleter *completer = new QCompleter(wordList, this);
// completer->setCaseSensitivity(Qt::CaseInsensitive);
ui->lineEditWord->setCompleter(completer);
}
但是,当行ui-&gt; lineEditWord-&gt; setCompleter(完成者)已经执行时;内存使用量增加,当我多次调用此方法时,内存使用量会增长。那我怎么能从这里释放记忆?我应该删除lineEdit的当前完成者
请帮助
答案 0 :(得分:2)
您使用的QCompleter
构造函数将QStringList
作为参数。肯定是(虽然没有正确记录),一个方便构造函数,它创建一个QStringListModel
,填充传递给构造函数的字符串,并将此模型设置为QCompleter::setModel()
的完成模型。
您可以使用以下代码更新模型所代表的字符串列表:
QStringList originalStringList;
originalStringList << "red" <<"orange" << "yellow";
QCompleter *completer = new QCompleter(originalStringList);
QStringListModel *stringListModel = qobject_cast< QStringListModel* >(completer->model());
QStringList newStringList;
newStringList << "blue" <<"green" << "purple";
stringListModel->setStringList(wewStringList);
如果你想确定你在做什么,我建议分别创建完成者和数据模型:
QCompleter *completer = new QCompleter();
QStringListModel *stringListModel = new QStringListModel();
completer->setModel(stringListModel);
QStringList originalStringList;
originalStringList << "red" <<"orange" << "yellow";
stringListModel->setStringList(originalStringList);
在这种情况下,您只需将stringListModel存储为MainWindow的成员,并在每次通过MainWindow::slotResults()
方法时更新字符串列表。
答案 1 :(得分:1)
您通过此方法为每次传递分配QCompleter
。除非QLineEdit
解除分配,否则这是内存泄漏
一种解决方案是将指针存储为MainWindow
的成员,然后将delete
存储在~MainWindow()
中,另一种方式是使智能指针成员存储它以便内存自动存储窗口超出范围时删除。
你真的不需要创建多个完成者。如果你只是记得以任何最适合你的实现要求的方式删除前一个。
答案 2 :(得分:1)
这没有记录,但如果旧的完成者将QLineEdit
作为父级,当您设置新的完成者时,当您调用QLineEdit::setCompleter
时,会自动删除旧的完成者。你只需要创建这样的完成者:
QCompleter *completer = new QCompleter(wordList, ui->lineEditWord);
由于您显然是从SQL查询创建完成者,因此您可以使用QSqlQueryModel
或QSqlTableModel
而不是记录列表,并将其传递给QCompleter
构造函数,这样,您只需创建一次完成者,并在对数据库的该部分进行任何更改时调用QSqlQueryModel::setQuery
或QSqlTableModel::select
来更新完成者。