Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Multiple AutoCompleters for the same LineEdit box

Multiple AutoCompleters for the same LineEdit box

Scheduled Pinned Locked Moved Solved General and Desktop
26 Posts 3 Posters 6.4k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    Core2
    wrote on last edited by
    #1

    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.

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi
      If you dont find the actual cuase of the crash, you could
      use https://doc.qt.io/qt-5/qsignalblocker.html
      during startup.

      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #3

        Hi,

        Might be a silly question but are you sure your completer is valid when you set it on application startup ?

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        C 1 Reply Last reply
        2
        • SGaistS SGaist

          Hi,

          Might be a silly question but are you sure your completer is valid when you set it on application startup ?

          C Offline
          C Offline
          Core2
          wrote on last edited by
          #4

          @SGaist

          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?"

          1 Reply Last reply
          0
          • mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #5

            Hi
            where is your setupUI() ?

            C 1 Reply Last reply
            0
            • mrjjM mrjj

              Hi
              where is your setupUI() ?

              C Offline
              C Offline
              Core2
              wrote on last edited by
              #6

              @mrjj

              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.

              1 Reply Last reply
              0
              • mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #7

                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 :)

                C 1 Reply Last reply
                0
                • mrjjM mrjj

                  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 :)

                  C Offline
                  C Offline
                  Core2
                  wrote on last edited by
                  #8

                  @mrjj
                  Ok yeah i see that in the mainview.cpp which launches the animalsearch ui. It's exactly as you posted.

                  mrjjM 1 Reply Last reply
                  0
                  • C Core2

                    @mrjj
                    Ok yeah i see that in the mainview.cpp which launches the animalsearch ui. It's exactly as you posted.

                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    @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?

                    C 1 Reply Last reply
                    0
                    • mrjjM mrjj

                      @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?

                      C Offline
                      C Offline
                      Core2
                      wrote on last edited by Core2
                      #10

                      @mrjj

                      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();
                      }
                      
                      mrjjM 1 Reply Last reply
                      0
                      • C Core2

                        @mrjj

                        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();
                        }
                        
                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by mrjj
                        #11

                        @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.

                        C 1 Reply Last reply
                        0
                        • mrjjM mrjj

                          @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.

                          C Offline
                          C Offline
                          Core2
                          wrote on last edited by
                          #12

                          @mrjj

                          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.

                          1 Reply Last reply
                          0
                          • mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #13

                            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.

                            C 1 Reply Last reply
                            0
                            • mrjjM mrjj

                              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.

                              C Offline
                              C Offline
                              Core2
                              wrote on last edited by
                              #14

                              @mrjj

                              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.

                              1 Reply Last reply
                              0
                              • SGaistS Offline
                                SGaistS Offline
                                SGaist
                                Lifetime Qt Champion
                                wrote on last edited by
                                #15

                                Can you show the backtrace from your crash ?

                                Interested in AI ? www.idiap.ch
                                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                C 1 Reply Last reply
                                1
                                • SGaistS SGaist

                                  Can you show the backtrace from your crash ?

                                  C Offline
                                  C Offline
                                  Core2
                                  wrote on last edited by
                                  #16

                                  @SGaist

                                  backtrace? I don't know what that is.

                                  C 1 Reply Last reply
                                  0
                                  • SGaistS Offline
                                    SGaistS Offline
                                    SGaist
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #17

                                    It's the list of functions called shown by the debugger when the application crashes.

                                    Interested in AI ? www.idiap.ch
                                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                    C 1 Reply Last reply
                                    0
                                    • mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #18

                                      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 ?

                                      C 1 Reply Last reply
                                      0
                                      • SGaistS SGaist

                                        It's the list of functions called shown by the debugger when the application crashes.

                                        C Offline
                                        C Offline
                                        Core2
                                        wrote on last edited by Core2
                                        #19

                                        @SGaist

                                        I think by watching this video by VoidRealms I will be able to gather this info.
                                        https://www.youtube.com/watch?v=B7UsWtyhXh4

                                        1 Reply Last reply
                                        1
                                        • mrjjM mrjj

                                          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 ?

                                          C Offline
                                          C Offline
                                          Core2
                                          wrote on last edited by
                                          #20

                                          @mrjj

                                          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.

                                          mrjjM 1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved