Solved Multiple AutoCompleters for the same LineEdit box
-
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() ? -
The animalsearch ui is launched when a button is clicked on the parent ui. Does that answer the question? I'm not a seasoned Qt user so I may have not understood your question. Thanks for your time.
-
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 :)
-
@mrjj
Ok yeah i see that in the mainview.cpp which launches the animalsearch ui. It's exactly as you posted. -
@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(); }
-
@Core2
ok. odd. but dialog works and the widgets in the UI are shown so
that part does work?
I mean, there is no issues with
ui->cmbFilter->addItems(animals); ?
That would really crash if dangling pointer. -
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 ?
-
backtrace? I don't know what that is.
-
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 ? -
I think by watching this video by VoidRealms I will be able to gather this info.
https://www.youtube.com/watch?v=B7UsWtyhXh4 -
I mean that in the animalsearch ui(new Ui::AnimalSearch) I create the Qcompleters from data i collect from sql into a model that i parse to QstringLists, then in a cmbFilter slot I assign the Qcompleter to the lineBy box.
-
@Core2
Ok. that should just work.
I tried the Qt completer sample and there seems to be no issues switching completer. -
Interesting. I may set up a test project where i set up a basic program to do this one thing with a cmbFilter, and a LineEdit. Until then I think I go the debugger working and am getting good info. I'm about to respond to SGaist.
-
@Core2
Ok. good plan. The call stack will show what happened up till the crash.