2011-09-26 34 views
0

我有在以下所示Q滤波方法:完成者QLineEdit的的得到记忆

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-> lineEditWord-> setCompleter(完成者)已beeen execited;内存使用增加,当我多次调用此方法时,内存使用量会增加。所以我怎么能释放内存呢?我应该删除lineEdit

目前完成者

请帮助

回答

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

您分配每次通过这种方法QCompleter。除非QLineEdit被解除分配它,这是一个存储器泄漏

一种解决方案是将指针存储为的MainWindow成员然后delete它在~MainWindow()另一种方式是将有一个智能指针构件来存储它,以便存储器是自动当窗口超出范围时删除。

你真的不需要创建多个完成者。如果您确实记得以任何方式删除之前的最佳实施要求。

+0

谢谢,是否可以用Code解释我? –

+0

我不确定你的目标是什么或周围的实现。这只是基于您显示的有限代码的一般建议。 – AJG85

1

这是没有记录,但如果旧的完成者有QLineEdit作为父母,当您设置一个新的完成者时,旧的完成者会在您拨打QLineEdit::setCompleter时自动删除。你只需要创建一个类似的完成者:

QCompleter *completer = new QCompleter(wordList, ui->lineEditWord); 

既然你显然是从一个SQL查询创建完成者,你可以使用一个QSqlQueryModelQSqlTableModel,而不是记录的列表,并把它传递给QCompleter构造,这样,您只需创建一次完成程序,并在您对数据库的该部分进行任何更改时,致电QSqlQueryModel::setQueryQSqlTableModel::select更新完成程序。