Завершитель QLineEdit получить память - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть метод 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-> lineEditWord-> setCompleter (завершитель) была выполнена;использование памяти увеличивается, и когда я вызываю этот метод несколько раз, использование памяти растет.так как я могу освободить память от этого?Должен ли я удалить текущий завершитель lineEdit

просьба помочь

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Используемый вами конструктор 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::slotResults().

1 голос
/ 28 сентября 2011

Это не задокументировано, но если старый завершитель имеет QLineEdit в качестве родителя, при установке нового завершителя старый завершитель удаляется автоматически при вызове QLineEdit::setCompleter.Вам просто нужно создать завершитель следующим образом:

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

Поскольку вы, очевидно, создаете завершитель из SQL-запроса, вы можете использовать QSqlQueryModel или QSqlTableModel вместо списка записей ипередайте его конструктору QCompleter, таким образом, вам нужно будет только создать завершитель один раз и вызвать QSqlQueryModel::setQuery или QSqlTableModel::select, чтобы обновить завершитель всякий раз, когда вы вносите какие-либо изменения в эту часть базы данных.

1 голос
/ 27 сентября 2011

Вы выделяете QCompleter на каждом проходе через этот метод.Если QLineEdit не освобождает его, это утечка памяти

Одним из решений является сохранение указателя как члена MainWindow, а затем delete его в ~MainWindow() другим способом было бы иметь смартэлемент указателя для его сохранения, чтобы память автоматически удалялась, когда окно выходит из области видимости.

Вам действительно не нужно создавать более одного завершителя.Если вы просто забыли удалить предыдущее любым способом, который лучше всего подходит для ваших требований к реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...