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. [solved] How to make cell in the Table View a QCombobox when an user edits ?
Forum Updated to NodeBB v4.3 + New Features

[solved] How to make cell in the Table View a QCombobox when an user edits ?

Scheduled Pinned Locked Moved General and Desktop
qcomboboxqtableview
15 Posts 3 Posters 20.3k Views 3 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.
  • RatzzR Offline
    RatzzR Offline
    Ratzz
    wrote on last edited by Ratzz
    #1

    I am using QFileSystemModel to set model and view it using Qtableview.
    When any user edits the cell of the table i want the cell to be editable and make that particular cell as combobox .

    1 Reply Last reply
    0
    • S Offline
      S Offline
      Sam
      wrote on last edited by
      #2

      Hi,

      You can use a QStyledItemDelegate to your tableView. You can also have a look at this WIKI documentation that uses a combobox delegate.

      1 Reply Last reply
      0
      • RatzzR Offline
        RatzzR Offline
        Ratzz
        wrote on last edited by
        #3
        This post is deleted!
        1 Reply Last reply
        0
        • RatzzR Offline
          RatzzR Offline
          Ratzz
          wrote on last edited by Ratzz
          #4

          @Sam
          My code looks like this
          Mainwindow.h

          #ifndef MAINWINDOW_H
          #define MAINWINDOW_H
          #include <QMainWindow>
          #include <QTableView>
          #include <QWidget>
          #include <QApplication>
          #include <QFileSystemModel>
          
          namespace Ui {
          class MainWindow;
          }
          
          class MainWindow : public QMainWindow
          {
              Q_OBJECT
              
          public:
              explicit MainWindow(QWidget *parent = 0);
              ~MainWindow();
              
          private:
              Ui::MainWindow *ui;
          };
          
          #endif // MAINWINDOW_H
          

          main.cpp

          #include <QtGui/QApplication>
          #include "mainwindow.h"
          
          int main(int argc, char *argv[])
          {
              QApplication a(argc, argv);
              MainWindow w;
              return a.exec();
          }
          

          mainwindow.cpp

          #include "mainwindow.h"
          #include "ui_mainwindow.h"
          
          MainWindow::MainWindow(QWidget *parent) :
              QMainWindow(parent),
              ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
              QFileSystemModel *model = new QFileSystemModel;//creating model
               model->setRootPath(QDir::currentPath());
          
              QTableView *view = new QTableView; //creating view
               view->setModel(model);
               view->show();//viewing
          }
          
          MainWindow::~MainWindow()
          {
              delete ui;
          }
          

          How to use QStyledItemDelegate on the above code?

          1 Reply Last reply
          0
          • S Offline
            S Offline
            Sam
            wrote on last edited by
            #5

            @Ratzz

            You need to create a separate class as shown in the WIKI document link , Then create an instance and set it to your tableView.

            e,g

            ComboBoxDelegate *comboDelegate = new ComboBoxDelegate(this);
            m_tableView->setItemDelegateForColumn(col,comboDelegate );
            SGaistS 1 Reply Last reply
            0
            • RatzzR Offline
              RatzzR Offline
              Ratzz
              wrote on last edited by
              #6

              @Sam
              Thanks for the reply .
              I am newbie to QT i did not understand how to create an instance and set it to your tableView.
              I am now trying with QItemDelegate now.
              Can you just tell which part of the code need to be edited ?

              1 Reply Last reply
              0
              • RatzzR Offline
                RatzzR Offline
                Ratzz
                wrote on last edited by Ratzz
                #7

                @Sam
                I tried with QStandardItemModel . But i want tableview be the combobox when edited.

                MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                {
                    ui->setupUi(this);
                    QStandardItemModel *model = new QStandardItemModel(4,2,this);
                    ui->tableView->setModel(model);
                     for(int row = 0; row < 4; row++)
                             {
                                 for(int col = 0; col < 2; col++)
                                 {
                                     QModelIndex index= model->index(row,col,QModelIndex());
                
                                     // 0 for all data
                                     model->setData(index, 0) ;
                                 }
                             }
                
                     QComboBox *combo = new QComboBox(this);
                     combo->setModel(model);
                }
                
                
                1 Reply Last reply
                0
                • S Sam

                  @Ratzz

                  You need to create a separate class as shown in the WIKI document link , Then create an instance and set it to your tableView.

                  e,g

                  ComboBoxDelegate *comboDelegate = new ComboBoxDelegate(this);
                  m_tableView->setItemDelegateForColumn(col,comboDelegate );
                  SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  Hi

                  e,g

                  ComboBoxDelegate *comboDelegate = new ComboBoxDelegate(this);
                  m_tableView->setItemDelegateForColumn(col,comboDelegate );
                  

                  @Sam gave you the example there ^^^^

                  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
                  • RatzzR Offline
                    RatzzR Offline
                    Ratzz
                    wrote on last edited by Ratzz
                    #9

                    @sam @SGaist
                    I have created a separate class ComboBoxDelegate which contains same code as the above wiki document .
                    where to create an instance and set it to tableView ? in main.cpp or in mainwindow.cpp? or in comboboxitemdelegate.cpp

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      Sam
                      wrote on last edited by
                      #10

                      The place where you can access the instance of tableView or where you instantiate your tableView. So in this case it should be in the constructor of MainWindow

                      view->setItemDelegateForColumn(col,comboDelegate );
                      1 Reply Last reply
                      1
                      • RatzzR Offline
                        RatzzR Offline
                        Ratzz
                        wrote on last edited by
                        #11

                        @sam
                        Thanks it works :)

                        1 Reply Last reply
                        0
                        • RatzzR Offline
                          RatzzR Offline
                          Ratzz
                          wrote on last edited by Ratzz
                          #12

                          @Sam
                          I have 2 column and 4 rows if i set

                          view->setItemDelegateForColumn(1,comboDelegate );
                          

                          Entire column "1 " will be a combobox .

                          If i set

                          view->setItemDelegateForRow(1,comboDelegate );
                          

                          only row 1 corresponding to first column will be combobox (one cell only )
                          What if i want only one row to be a combobox?

                          1 Reply Last reply
                          0
                          • RatzzR Offline
                            RatzzR Offline
                            Ratzz
                            wrote on last edited by Ratzz
                            #13

                            @Sam now its working fine :)

                            Is there any option to make particular cell a combobox ?(not entire row or column )

                            1 Reply Last reply
                            0
                            • S Offline
                              S Offline
                              Sam
                              wrote on last edited by
                              #14

                              So you mean to say you want to display the combobox only for one specific cell, In this case you can also try with setIndexWidget() which will display a combobox for a particular modelIndex.

                              1 Reply Last reply
                              0
                              • RatzzR Offline
                                RatzzR Offline
                                Ratzz
                                wrote on last edited by Ratzz
                                #15

                                @Sam
                                Thanks you :)
                                Why can't i set using? can't we do it for tableview? is it only for widgets?

                                 tableView->setIndexWidget(index,comboDelegate);
                                

                                'QAbstractItemView::setIndexWidget' : cannot convert parameter 2 from 'ComboBoxDelegate *' to 'QWidget *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

                                This works fine

                                 tableView->setIndexWidget(index,new QLineEdit);
                                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