Multiple AutoCompleters for the same LineEdit box
-
Hello all,
I have a Line Edit box and a Combo Box in my program. My program searches a DB using the info found in the aforementioned boxes. The Lined Edit box is the search term and the Combo box is the filter to search by.
e.g. the Combo box contains search filters Turtle, Rabbit, Dog, Cat
If I select Turtle in the combo box, and type "Box" in the Line Edit my program will return all the info the DB has on Box Turtles.I would like to have an autocomplete available with previous search terms. I don't want Cat, Dog, and Turtle Search terms in the same list. What I would like to accomplish is, the state of the combo box determines what AutoComplete is currently working on the Line Edit.
What i have tried so far is create a slot for the combo box with signal currentIndexChanged(int)
I have created 4 QCompleter's *TurtleCompleter, *RabbitCompleter, ..etc.
Data is pulled in for my recent 5 searches for each of my four filters and stored in a model.
I iterate over that model and store the last 5 search terms in a QStringList for each filter, TurtleList, RabbitList, DogList, CatList.
After that a new Qcompleter is made called TurtleCompleter, RabbitCompleter, DogCompleter, CatCompleter.
by default i assign the TurtleCompleter to the LineEdit via:
ui->lineEdit->setCompleter(TurtleCompleter);
As a test i hard coded a change the completer in the comboBox slot via
ui->lineEdit->setCompleter(RabbitCompleter);
My program crashes when first fired up. The bombo box slot code is being executed when the program is launched. I guess becuase the program detects the default combo box filter as a change when the program starts.
If I comment out the ui->lineEdit->setCompleter(RabbitCompleter); the program runs fine but without the autocompleter changing to match the filter selected in the combo box.Any Help would be greatly appreciated.
-
Hi
If you dont find the actual cuase of the crash, you could
use https://doc.qt.io/qt-5/qsignalblocker.html
during startup. -
Hi,
Might be a silly question but are you sure your completer is valid when you set it on application startup ?
-
In the animalsearch.h file i have the following:
namespace Ui { class AnimalSearch; } class AnimalSearch : public QDialog { Q_OBJECT public: stuff private slots: stuff signals: stuff private: QCompleter *TurtleCompleter; QCompleter *RabbitCompleter; QCompleter *DogCompleter; QCompleter *CatCompleter; };
In the animalsearch.cpp i have the following:
#includes section AnimalSearch::AnimalSearch(QWidget *parent): QDialog(parent), ui(new Ui::AnimalSearch) { QStringList animals << "Turtle" << "Rabbit" << "Dog" << "Cat"; ui->cmbFilter->addItems(animals); //section that collects the past animal search and stores in a model. //Then I parse the data out of the model into individual QStringLists: TurtleList, RabbitList, DogList, CatList; //Display each string list to make certain it is good. (the data looks good when i run.) qDebug() << TurtleList; qDebug() << RabbitList; qDebug() << DogList; qDebug() << CatList; //Then I build the completers TurtleCompleter = new QCompleter(TurtleList, this); ui->lineBy->setCompleter(TurtleList); //Default Completer RabbitCompleter = new QCompleter(RabbitList, this); DogCompleter = new QCompleter(DogList, this); CatCompleter = new QCompleter(CatList, this); } //Section about cmbFilter selection void AnimalSearch::on_cmbFilter_currentIndexChanged() { //for a test just neglect the current index and try to change the qcompleter being used by the lineBy box. qDebug() << "Does this print?"; ui->lineBy->setCompleter(RabbitCompleter); }
When the program is run it crashes after the qDebug() << "Does this print?"
-
Hi
where is your setupUI() ? -
Hi
sorry if not clear.
Normally when using UI files, there is a call to a function that creates the objects.
MainWindow::MainWindow(QWidget* parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
ui->setupUi(this); <<<< --- std.I could not see in your code so i did wonder. but if it runs it must be there :)
-
@Core2
Ok, but i assume you have the same for AnimalSearch or else anything you have in the UI files
will be dangling pointers.You call setupUI manually from mainwindow or something like that ?
Can you show how you init AnimalSearch ?
if you never call setup, the line ui->cmbFilter->xxx would crash
so since it seems something else, i guess its ok, just not standard way? -
from mainview.cpp
//Needs better commenting. void MainView::on_btnAnimalSearch_clicked() { AnimalSearch animalsearch; animalsearch.setModal(true); connect(&animalsearch, SIGNAL(sendData(QString)), this, SLOT(printData(QString))); animalsearch.exec(); }
-
yeah that part works and has been for some time. now that i introduced multiple Qcompleters and trying to assign a Qcompleter depending on cmbFilter state is when things started failing. As you can see from the example code above I assign a default of TurtleQcompleter, and then in the section of code:
void AnimalSearch::on_cmbFilter_currentIndexChanged()
runs when the animalsearch ui is started, even though I don't change the cmbFilter, and I try for a test to set the Qcompleter to Rabbit Qcompleter from the earlier assignment of TurtleQcompleter.
-
Hi
yes it will fire such signal when current item/index is set.
Also when done in code as doc states
http://doc.qt.io/qt-5/qcombobox.html#currentIndexChanged
So that is pretty normal. -
Ok good to know. I will remove my line where I assign a default Qcompleter, and allow this section of code to make the first assignment.
Now i just have to figure out after I make the Qcompleters why i can't assign a different Qcompleter from elsewhere in the code.
Thanks again for your time.
-
Can you show the backtrace from your crash ?
-
It's the list of functions called shown by the debugger when the application crashes.
-
Hi
What you mean by
"why i can't assign a different Qcompleter from elsewhere in the code" ?
In what why does it not work ?