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. Problem getting QComboBox from QWidget
Qt 6.11 is out! See what's new in the release blog

Problem getting QComboBox from QWidget

Scheduled Pinned Locked Moved General and Desktop
14 Posts 5 Posters 8.1k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi,

    You must use qobject_cast when dealing with casts not C style. Also, always verify that what you get is what your asked for.

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

    1 Reply Last reply
    0
    • D Offline
      D Offline
      darkp03
      wrote on last edited by darkp03
      #3

      Hi, thanks for your answer.
      Im getting closer, but it still wont work. Probably not casting the right way (even though I made it exactly as internet example)

      This is what Im doing

      QWidget *Widget=ui->tableWidget_DataTs->cellWidget(1,2);
      QComboBox *DataRate;
      DataRate= qobject_cast<QComboBox*>(Widget);
      

      According to the debugger, Right after I do

      QComboBox *DataRate;

      DataRate is type QComboBox

      After i do

      DataRate= qobject_cast<QComboBox*>(Widget);

      DataRates transforms into type QComboBox* with a NULL value.

      What am I missing?

      The casts ive tried.
      qobject_cast Obtains a QComboBox* with NULL value
      dynamic_cast Obtains a QComboBox* with NULL value
      static_cast Obtains a QWidget with information on it
      reinterpret_cast Obtains a QWidget with information on it

      None of those casts would work

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

        Did you check what cellWidget(1, 2) returns ? Is it a valid widget ? What should that be ? How did you put the combo box there in the first place ?

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

        1 Reply Last reply
        1
        • D Offline
          D Offline
          darkp03
          wrote on last edited by darkp03
          #5

          Yes, it returns a valid Widget.

          This is how I place the ComboBox

          QComboBox *Index;
          Index=new QComboBox;
          QStringList Names;
          Names<<"64kbps"<<"32kbps"<<"16kbps";
          Index->addItems(Names);
          //Here I have created the QComboBox, now I place it in a Widget, and I allign it to the center
          
          QWidget *Widget=new QWidget;
          QHBoxLayout *Layout=new QHBoxLayout(Widget);
          Layout->addWidget(Index);
          Layout->setAlignment(Qt::AlignCenter);
          Widget->setLayout(Layout)
          
          ui->tableWidget_DataTs->setCellWidget(0,2,Widget);
          
          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #6

            So cellWidget doesn't return a combo box, it returns a widget containing a layout containing your combo box

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

            M 1 Reply Last reply
            2
            • SGaistS SGaist

              So cellWidget doesn't return a combo box, it returns a widget containing a layout containing your combo box

              M Offline
              M Offline
              maratk1n
              wrote on last edited by
              #7

              @SGaist so, how we can cast it to QComboBox*?

              jsulmJ 1 Reply Last reply
              0
              • M maratk1n

                @SGaist so, how we can cast it to QComboBox*?

                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by
                #8

                @maratk1n Use http://doc.qt.io/qt-5/qobject.html#children to get children widgets of ui->tableWidget_DataTs->cellWidget(1,2); and go through the children list until you can successfully cast to QComboBox*.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                M 1 Reply Last reply
                5
                • jsulmJ jsulm

                  @maratk1n Use http://doc.qt.io/qt-5/qobject.html#children to get children widgets of ui->tableWidget_DataTs->cellWidget(1,2); and go through the children list until you can successfully cast to QComboBox*.

                  M Offline
                  M Offline
                  maratk1n
                  wrote on last edited by maratk1n
                  #9

                  @jsulm Thank you! This helped solve my problem.

                  Create table:

                  for(int i = 0; i < dataCount; i++){
                      ui->tableWidget->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Stretch);
                      for (int j = 1; j < rowCount; j++) {
                          QWidget *checkBoxWidget = new QWidget();
                          QCheckBox *checkBox = new QCheckBox();
                          QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget);
                          checkBox->setChecked(false);
                          layoutCheckBox->addWidget(checkBox);
                          layoutCheckBox->setAlignment(Qt::AlignCenter);
                          layoutCheckBox->setContentsMargins(0,0,0,0);
                          ui->tableWidget->setCellWidget(j, i, checkBoxWidget);
                      }
                      QComboBox* comboBox = new QComboBox();
                      comboBox->setEnabled(false);
                      comboBox->addItems(dataTypes);
                      ui->tableWidget->setCellWidget(0, i, comboBox);
                  }
                  

                  Read checkboxes:

                  for (int i = 0; i < ui->dataCount->currentIndex(); i++) {
                      QComboBox *dataType = static_cast<QComboBox*>(ui->tableWidget->cellWidget(0, i));
                      QCheckBox *inversion = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(1, i)->children().last());
                      QCheckBox *plot = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(2, i)->children().last());
                      QCheckBox *bitwise = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(3, i)->children().last());
                      device->setRDataType(str2QVariant(dataType->currentText()), inversion->isChecked());
                      if (plot->isChecked()) { // plot needed
                      }
                      if (bitwise->isChecked()) { // bit representation needed
                      }
                  }
                  
                  jsulmJ 1 Reply Last reply
                  0
                  • M maratk1n

                    @jsulm Thank you! This helped solve my problem.

                    Create table:

                    for(int i = 0; i < dataCount; i++){
                        ui->tableWidget->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Stretch);
                        for (int j = 1; j < rowCount; j++) {
                            QWidget *checkBoxWidget = new QWidget();
                            QCheckBox *checkBox = new QCheckBox();
                            QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget);
                            checkBox->setChecked(false);
                            layoutCheckBox->addWidget(checkBox);
                            layoutCheckBox->setAlignment(Qt::AlignCenter);
                            layoutCheckBox->setContentsMargins(0,0,0,0);
                            ui->tableWidget->setCellWidget(j, i, checkBoxWidget);
                        }
                        QComboBox* comboBox = new QComboBox();
                        comboBox->setEnabled(false);
                        comboBox->addItems(dataTypes);
                        ui->tableWidget->setCellWidget(0, i, comboBox);
                    }
                    

                    Read checkboxes:

                    for (int i = 0; i < ui->dataCount->currentIndex(); i++) {
                        QComboBox *dataType = static_cast<QComboBox*>(ui->tableWidget->cellWidget(0, i));
                        QCheckBox *inversion = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(1, i)->children().last());
                        QCheckBox *plot = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(2, i)->children().last());
                        QCheckBox *bitwise = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(3, i)->children().last());
                        device->setRDataType(str2QVariant(dataType->currentText()), inversion->isChecked());
                        if (plot->isChecked()) { // plot needed
                        }
                        if (bitwise->isChecked()) { // bit representation needed
                        }
                    }
                    
                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    @maratk1n One note: you should ALWAYS check pointers! Else your app will crash if any of them is null or dangling pointer.

                    QComboBox *dataType = static_cast<QComboBox*>(ui->tableWidget->cellWidget(0, i));
                    ...
                    if (plot && plot->isChecked()) {
                    

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    M 1 Reply Last reply
                    3
                    • jsulmJ jsulm

                      @maratk1n One note: you should ALWAYS check pointers! Else your app will crash if any of them is null or dangling pointer.

                      QComboBox *dataType = static_cast<QComboBox*>(ui->tableWidget->cellWidget(0, i));
                      ...
                      if (plot && plot->isChecked()) {
                      
                      M Offline
                      M Offline
                      maratk1n
                      wrote on last edited by maratk1n
                      #11

                      @jsulm sure, you are right :)
                      With dynamic_cast I should try catch exception bad_cast with references or check pointer as well as with static_cast.

                      JonBJ 1 Reply Last reply
                      0
                      • M maratk1n

                        @jsulm sure, you are right :)
                        With dynamic_cast I should try catch exception bad_cast with references or check pointer as well as with static_cast.

                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by
                        #12

                        @maratk1n

                        With dynamic_cast I should try catch exception bad_cast

                        ? dynamic_cast<> returns nullptr if not of right type, it does not throw?

                        M 1 Reply Last reply
                        1
                        • JonBJ JonB

                          @maratk1n

                          With dynamic_cast I should try catch exception bad_cast

                          ? dynamic_cast<> returns nullptr if not of right type, it does not throw?

                          M Offline
                          M Offline
                          maratk1n
                          wrote on last edited by
                          #13

                          @JonB

                          Perhaps I incorrectly expressed my thought, but I wanted to say this:

                          Otherwise, the runtime check fails. If the dynamic_cast is used on pointers, the null pointer value of type new_type is returned. If it was used on references, the exception std::bad_cast is thrown.

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

                            Beware: static_cast doesn't do any checks so unless it was given a null pointer, it will not return a nullptr.

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

                            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