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
Forum Updated to NodeBB v4.3 + New Features

Problem getting QComboBox from QWidget

Scheduled Pinned Locked Moved General and Desktop
14 Posts 5 Posters 5.0k 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 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 Online
                    JonBJ Online
                    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