qt — Фильтр с переполнением стека QComboBox

Я хочу создать редактируемый QComboBox, который фильтрует результаты по поисковому запросу и соответствующим образом обновляет выпадающие записи.

После прочтения Как отфильтровать элементы PyQt QCombobox на основе ввода текста? Я пытался реализовать нечто подобное в C ++.

Но сейчас я не могу ничего хранить внутри QComboBox. Даже после добавления новых записей через addItem () общее количество остается равным 0.

В чем причина этого и как я могу вставить записи в QComboBox с QSortFilterProxyModel?

Вот соответствующий фрагмент кода:

SearchBox = new QComboBox(this);
SearchBox->setEditable(true);

// Try adding a few entries and check if they persist after changing the model
SearchBox->addItem(QString("hi"));
SearchBox->addItem(QString("bye"));

int count = SearchBox->count();    // count = 2

ProxyModel = new QSortFilterProxyModel;
ProxyModel->setSourceModel(SearchBox->model());
ProxyModel->setFilterCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
SearchBox->setModel(ProxyModel);

// Check count again
count = SearchBox->count();    // count = 0     <- Why?

// Try adding new entries
SearchBox->addItem(QString("Hi again"));

count = SearchBox->count();    // count = 0  .. So new entries don't get storedCompleter = new QCompleter(ProxyModel,this);
Completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
SearchBox->setCompleter(Completer);QObject::connect(SearchBox->lineEdit(), SIGNAL(textChanged(const QString)), ProxyModel, SLOT(setFilterFixedString(const QString)));
QObject::connect(Completer, SIGNAL(activated(const QString &)), this, SLOT(onCompleterActivated(const QString &)));

3

Решение

использование QStringListModel хранить предметы. Приложение аварийно завершает работу, если у прокси-модели нет элементов (если строка фильтра отфильтровывает все элементы) (это требует дальнейшего изучения — это полная проблема или выпадающий список). Это можно исправить, не применяя такой фильтр (onTextChanged(QString text) слот). Completer завершает ввод, если есть только один элемент (не уверен, что все в порядке). И иногда флажок удваивает все элементы (не знаю почему). Если эта проблема критична, я думаю, что вам нужно написать собственный ComboBox с нуля, и это серьезная работа.

{
SearchBox = new QComboBox(this);
SearchBox->setEditable(true);

QStringList Items;
Items << "hi" << "bye";
StringListModel = new QStringListModel();
StringListModel->setStringList(Items);

ProxyModel = new QSortFilterProxyModel;
ProxyModel->setSourceModel(StringListModel);
ProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
SearchBox->setModel(ProxyModel);

// Check count again
int count = SearchBox->count();    // count = 2

// Try adding new entries
QStringList Items_ = StringListModel->stringList();
Items_ << "hi again";
StringListModel->setStringList(Items_);

count = SearchBox->count();    // count = 3

Completer = new QCompleter(ProxyModel,this);
Completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
SearchBox->setCompleter(Completer);

QObject::connect(SearchBox->lineEdit(), SIGNAL(textChanged(const QString)), this, SLOT(onTextChanged(QString)));
QObject::connect(Completer, SIGNAL(activated(const QString &)), this, SLOT(onCompleterActivated(const QString &)));
}

void MainWindow::onTextChanged(QString Text) {
QStringList Items = StringListModel->stringList();
QString Item;
foreach(Item,Items) {
if (Item.indexOf(Text) > -1) {
ProxyModel->setFilterFixedString(Text);
return;
}
}
}
1

Другие решения


По вопросам рекламы [email protected]