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. Errors in subclass of QSqlRelationalDelegate

Errors in subclass of QSqlRelationalDelegate

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 3 Posters 1.1k 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.
  • P Offline
    P Offline
    Panoss
    wrote on last edited by
    #1

    In a subclass of QSqlRelationalDelegate I don't know how the correct code is.
    At this line: 'if (isinstance(editor, QComboBox)){'
    I get this error: ' error: 'QComboBox' does not refer to a value
    qcombobox.h:59:24: note: declared here'

    At line 'editor->model().select();'...
    I get this: ' error: no member named 'model' in 'QWidget''

    I have iincluded QComboBox and QtWidgets

    QWidget *BookDelegate::createEditor(QWidget *parent,
                                        const QStyleOptionViewItem &option,
                                        const QModelIndex &index) const
    {
        int positionColumn = 2;
        qDebug()<< "BookDelegate.createEditor index.column()=" << (index.column()) << " option=" << option ;
        if (index.column() == positionColumn){
            QWidget *editor = QSqlRelationalDelegate::createEditor(parent, option, index);
            if (isinstance(editor, QComboBox)){
                editor->model().select();
                return editor;
            }
        }
    
    Christian EhrlicherC 1 Reply Last reply
    0
    • P Panoss

      In a subclass of QSqlRelationalDelegate I don't know how the correct code is.
      At this line: 'if (isinstance(editor, QComboBox)){'
      I get this error: ' error: 'QComboBox' does not refer to a value
      qcombobox.h:59:24: note: declared here'

      At line 'editor->model().select();'...
      I get this: ' error: no member named 'model' in 'QWidget''

      I have iincluded QComboBox and QtWidgets

      QWidget *BookDelegate::createEditor(QWidget *parent,
                                          const QStyleOptionViewItem &option,
                                          const QModelIndex &index) const
      {
          int positionColumn = 2;
          qDebug()<< "BookDelegate.createEditor index.column()=" << (index.column()) << " option=" << option ;
          if (index.column() == positionColumn){
              QWidget *editor = QSqlRelationalDelegate::createEditor(parent, option, index);
              if (isinstance(editor, QComboBox)){
                  editor->model().select();
                  return editor;
              }
          }
      
      Christian EhrlicherC Online
      Christian EhrlicherC Online
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @Panoss said in Errors in subclass of QSqlRelationalDelegate:

      isinstance

      What does this function do / where is it defined? You for sure want to use qobject_cast<>() instead.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      P 1 Reply Last reply
      3
      • Christian EhrlicherC Christian Ehrlicher

        @Panoss said in Errors in subclass of QSqlRelationalDelegate:

        isinstance

        What does this function do / where is it defined? You for sure want to use qobject_cast<>() instead.

        P Offline
        P Offline
        Panoss
        wrote on last edited by
        #3

        @Christian-Ehrlicher said in Errors in subclass of QSqlRelationalDelegate:

        use qobject_cast<>() instead.

        I did it this way:

        qobject_cast <QComboBox*>(editor )){
        editor->model().select();
        

        The error from the first line is gone.
        On the second I get:
        'bookdelegate.cpp:133:21: error: no member named 'model' in 'QWidget''

        Christian EhrlicherC 1 Reply Last reply
        0
        • P Panoss

          @Christian-Ehrlicher said in Errors in subclass of QSqlRelationalDelegate:

          use qobject_cast<>() instead.

          I did it this way:

          qobject_cast <QComboBox*>(editor )){
          editor->model().select();
          

          The error from the first line is gone.
          On the second I get:
          'bookdelegate.cpp:133:21: error: no member named 'model' in 'QWidget''

          Christian EhrlicherC Online
          Christian EhrlicherC Online
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @Panoss said in Errors in subclass of QSqlRelationalDelegate:

          qobject_cast <QComboBox*>(editor )){

          And what should this help? You should assign the return value to a variable. c basics.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          P 1 Reply Last reply
          1
          • Christian EhrlicherC Christian Ehrlicher

            @Panoss said in Errors in subclass of QSqlRelationalDelegate:

            qobject_cast <QComboBox*>(editor )){

            And what should this help? You should assign the return value to a variable. c basics.

            P Offline
            P Offline
            Panoss
            wrote on last edited by
            #5

            @Christian-Ehrlicher
            What I 'm actually trying to do is convert this python code to Qt c++:

                def createEditor(self, parent, option, index):
                    # column of combo box 'position'
                    positionColumn = 2
                    print("myDelegate.createEditor index.column()=" + str(index.column()) + " option=" + str(option) )
                    if index.column() == positionColumn:
                        editor = QSqlRelationalDelegate.createEditor(self, parent, option, index)
                        if isinstance(editor, QComboBox):
                            editor.model().select()
                        return editor
                    else:
                        return super(myDelegate, self).createEditor(parent, option, index)
            
            JonBJ 1 Reply Last reply
            0
            • Christian EhrlicherC Online
              Christian EhrlicherC Online
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by Christian Ehrlicher
              #6

              Learning the very basics of c++ is not part of this forum. Doing a simple assignment of a function call to a variable is really not that hard.

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              1 Reply Last reply
              1
              • P Offline
                P Offline
                Panoss
                wrote on last edited by Panoss
                #7

                You mean this?

                QComboBox* mycombo = qobject_cast <QComboBox*>(editor );
                
                1 Reply Last reply
                0
                • P Offline
                  P Offline
                  Panoss
                  wrote on last edited by Panoss
                  #8

                  This is the code I ended up with (from the QSqlRelationalDelegate 's code), and works!
                  Any comments are welcome.

                  
                      int positionColumn = 2;
                      qDebug()<< "BookDelegate.createEditor index.column()=" << (index.column()) << " option=" << option ;
                      if (index.column() == positionColumn){
                          const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());
                          QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : nullptr;
                          if (!childModel)
                              return QStyledItemDelegate::createEditor(parent, option, index);
                  
                          QComboBox *combo = new QComboBox(parent);
                          combo->setModel(childModel);
                          combo->setModelColumn(1);
                          combo->installEventFilter(const_cast<BookDelegate *>(this));
                          childModel->select();
                          return combo;
                      }
                  
                  1 Reply Last reply
                  0
                  • P Panoss

                    @Christian-Ehrlicher
                    What I 'm actually trying to do is convert this python code to Qt c++:

                        def createEditor(self, parent, option, index):
                            # column of combo box 'position'
                            positionColumn = 2
                            print("myDelegate.createEditor index.column()=" + str(index.column()) + " option=" + str(option) )
                            if index.column() == positionColumn:
                                editor = QSqlRelationalDelegate.createEditor(self, parent, option, index)
                                if isinstance(editor, QComboBox):
                                    editor.model().select()
                                return editor
                            else:
                                return super(myDelegate, self).createEditor(parent, option, index)
                    
                    JonBJ Online
                    JonBJ Online
                    JonB
                    wrote on last edited by JonB
                    #9

                    @Panoss said in Errors in subclass of QSqlRelationalDelegate:

                            editor = QSqlRelationalDelegate.createEditor(self, parent, option, index)
                            if isinstance(editor, QComboBox):
                                editor.model().select()
                            return editor
                    
                    QWidget *editor = QSqlRelationalDelegate::createEditor(parent, option, index);
                    QComboBox *combo = qobject_cast<QComboBox *>(editor);
                    if (combo)
                         combo->model()->select();
                    return editor;
                    
                    P 1 Reply Last reply
                    2
                    • JonBJ JonB

                      @Panoss said in Errors in subclass of QSqlRelationalDelegate:

                              editor = QSqlRelationalDelegate.createEditor(self, parent, option, index)
                              if isinstance(editor, QComboBox):
                                  editor.model().select()
                              return editor
                      
                      QWidget *editor = QSqlRelationalDelegate::createEditor(parent, option, index);
                      QComboBox *combo = qobject_cast<QComboBox *>(editor);
                      if (combo)
                           combo->model()->select();
                      return editor;
                      
                      P Offline
                      P Offline
                      Panoss
                      wrote on last edited by
                      #10

                      @JonB said in Errors in subclass of QSqlRelationalDelegate:

                      return editor;

                      Should I return the editor or the combo?

                      JonBJ 1 Reply Last reply
                      0
                      • P Panoss

                        @JonB said in Errors in subclass of QSqlRelationalDelegate:

                        return editor;

                        Should I return the editor or the combo?

                        JonBJ Online
                        JonBJ Online
                        JonB
                        wrote on last edited by JonB
                        #11

                        @Panoss
                        Since I wrote return editor; and not return combo; you have the answer :)

                        But you should understand why this is. No matter what editor = QSqlRelationalDelegate::createEditor(), which is what you want to return under all circumstances. combo only has a != nullptr value if editor is a QComboBox * --- i.e. the createEditor() returned a QWidget which is a QComboBox --- and of course in that case editor == combo anyway. But if, for whatever reason, editor is not combobox/QComboBox * --- presumably for a column which is not the foreign key column but some other column --- you still want to return whatever that editor is.

                        My C++ is a direct translation of the original Python, which I presume to be correct/desired, unless you want to change that behaviour for some reason.

                        1 Reply Last reply
                        3
                        • P Offline
                          P Offline
                          Panoss
                          wrote on last edited by
                          #12

                          @JonB (and to all of course) thank you for your time and effort!
                          In python it works fine, I will try your code but I am sure it's fine!

                          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