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

QComboBox in QListWidget

Scheduled Pinned Locked Moved Unsolved General and Desktop
2 Posts 2 Posters 1.7k Views
  • 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.
  • S Offline
    S Offline
    sixeight
    wrote on last edited by VRonin
    #1

    I am able to get a ComboBox in my List Widget, but how can I get it to update my data? Whenever I change one of the comboboxes, i would like the appropriate VCsetting[].value to be updated.

    I am pretty new to QT. I have been looking at this for days. Read about delegates and everything, but I just can't get any of the examples to work. I simply do not understand them. I don't know what I am doing.

    Here is my VCsettings.h:

    #ifndef VCSETTINGS_H
    #define VCSETTINGS_H
    
    // Class for operate the settings of the VController
    #include <QDialog>
    #include <QTreeWidget>
    #include <QString>
    
    #define NUMBER_OF_SELECTABLE_COLOURS 10
    
    class VCsettings
    {
    public:
        VCsettings();
        void fillTreeWidget(QTreeWidget *my_tree);
        void showData();
    
    private slots:
        void comboBoxValueChanged(int);
    
    private:
        enum type_enum { HEADER, BOOL, VALUE };
        struct Setting_struct {
            QString name;
            type_enum type;
            int value;
            int min;
            int max;
            int sublist;
        };
    
    #define NUMBER_OF_SETTINGS 6
    
        Setting_struct VCsetting[NUMBER_OF_SETTINGS] = { // The values that are set here are the default settings of the application
            { "General Settings", HEADER, 0, 0, 0, 0 },
            { "Send tempo on patch change", BOOL, 1, 0, 1, 1 },
            { "US20 emulation active", BOOL, 0, 0, 1, 1 },
            { "Colour Settings", HEADER, 0, 0, 0, 0 },
            { "FX colour", VALUE, 1, 0, NUMBER_OF_SELECTABLE_COLOURS - 1, 4 },
            { "Default colour", VALUE, 3, 0, NUMBER_OF_SELECTABLE_COLOURS - 1, 4 },
        };
    
        QStringList menu_sublist = {
          // Sublist 1 - 3: Booleans
          "OFF", "ON", "DETECT",
    
          // Sublist 4 - 19: LED colours
          "OFF", "GREEN", "RED", "BLUE", "ORANGE", "TURQUOISE", "WHITE", "YELLOW", "PURPLE", "PINK", "", "", "", "", "", "",
    
          // Sublist 20 - 22: Main display modes
          "PAGE NAME", "PATCH NAME", "PATCHES COMBINED",
    
          // Sublist 23 - 30: MIDI ports
          "USB MIDI", "MIDI 1", "MIDI2/RRC", "MIDI 3", "ALL PORTS", "", "", "",
    
          // Sublist 31 - 34: Expression pedals
          "EXP PEDAL #1", "EXP PEDAL #2", "EXP PEDAL #3", "EXP PEDAL #4",
        };
    };
    
    #endif // VCSETTINGS_H
    

    Here is my VCsettings.cpp:

    #include "vcsettings.h"
    #include "comboboxdelegate.h"
    #include <QComboBox>
    #include <QDebug>
    
    VCsettings::VCsettings()
    {
    
    }
    
    void VCsettings::fillTreeWidget(QTreeWidget *my_tree)
    {
      my_tree->setColumnCount(2);
      my_tree->setHeaderLabels(QStringList() << "Parameter" << "Value");
      my_tree->setColumnWidth(0, 250);
    
      QTreeWidgetItem* parent_item = NULL;
    
      for (int i = 0; i < NUMBER_OF_SETTINGS; i++) {
          if (VCsetting[i].type == HEADER) {
              QTreeWidgetItem *item = new QTreeWidgetItem(my_tree);
              item->setText(0, VCsetting[i].name);
              my_tree->addTopLevelItem(item);
              parent_item = item;
          }
          else {
              if (parent_item) {
                QTreeWidgetItem *child = new QTreeWidgetItem(parent_item);
                child->setText(0, VCsetting[i].name);
                QComboBox *comboBox = new QComboBox(my_tree);
                //ComboBoxDelegate* comboBox = new ComboBoxDelegate(this);
                if (VCsetting[i].sublist > 0) { // Fill combobox with items from
                    int number_of_items = VCsetting[i].max - VCsetting[i].min + 1;
                    for (int j = 0; j < number_of_items; j++)
                      comboBox->addItem(menu_sublist.at(j + VCsetting[i].sublist - 1));
                    comboBox->setCurrentIndex(VCsetting[i].value);
                    //QAbstractItemDelegate::connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboBoxValueChanged(int)));
                }
                my_tree->setItemWidget(child, 1, comboBox);
                parent_item->addChild(child);
              }
          }
      }
    }
    
    void VCsettings::showData()
    {
        for (int i = 0; i < NUMBER_OF_SETTINGS; i++) {
            qDebug() << VCsetting[i].name << VCsetting[i].value ;
        }
    }
    
    void VCsettings::comboBoxValueChanged(int value)
    {
        qDebug() << value;
    }
    

    Relevant part of MainWindow.h:
    VCsettings *MyVCSettings;

    And in my MainWindows.cpp:

    MyVCSettings = new VCsettings();
        MyVCSettings->fillTreeWidget(ui->treeWidget);
    
    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2

      Nope, setItemWidget is the enemy of the people! the correct way is subclass QStyledItemDelegate and create a combobox editor in createEditor

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      3

      • Login

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