Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct

    Qvariant_cast prevents general access to superclass-data

    General and Desktop
    2
    3
    640
    Loading More Posts
    • 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.
    • J
      juergenhuber last edited by

      Hey,

      In a derived class from QAbstractTableModel I have impemented an user-role to give back the complete Object.

      @
      QVariant TmNotizTableModel::data(const QModelIndex &index, int role) const
      {
      int iRow,iCol, iMax;
      CSubclass mySubclass;

      mySubclass = mySubclassList.at(index.row());
      

      if( role == JUTABLEVIEW_USER_ROLE_OBJECT){
      QVariant v;
      qVariantSetValue(v, mySubclass);
      return v;
      }
      }
      @

      In a derived class from QTableView I reimplemented the edit - Method to do some general access handling, which needs the CBaic-Data. The Problem is that qvariant_cast doesn't give me the valid superclass object back.

      @
      bool JuTableView::edit (const QModelIndex & index, EditTrigger trigger, QEvent * event )
      {
      CBasic myCurrElement = qvariant_cast <CBasic> (index.model()->data(index, JUTABLEVIEW_USER_ROLE_OBJECT));
      // myCurrElement is standard constructed and has no valid data

      CSubclass myCurrSubclass = qvariant_cast <CSubclass> (index.model()->data(index, JUTABLEVIEW_USER_ROLE_OBJECT));
      // Is valid including the elements inherited from CBasic. 
      

      }
      @

      Here is a code snippet of the Class Architecture:

      I have the following sample architecture:
      @
      class CBasic
      {

      public:
      CBasic();

      void init(void);

      void setDbAdress(C_PKEY _dbadr){ dbAdress = _dbadr;};
      C_PKEY getDbAdress(void){ return dbAdress;};

      QByteArray getDbStream(void){return myDbStream;};
      void setDbStream(QByteArray _myDbStream){myDbStream = _myDbStream;};
      void setDbStream(const char *data, int iSize){setDbStream(QByteArray(data, iSize));};

      int getUserId(void){return iUserId;};
      void setUserId(int _iUserId){ iUserId = _iUserId;};

      protected:
      

      C_PKEY dbAdress;
      QByteArray myDbStream;
      int iUserId;

      };

      Q_DECLARE_METATYPE(CBasic);

      class CSubclass : plublic CBasic
      {

      public:
      CSubclass();

      void init(void);

      void setValue1(int _iValue1){ iValue1 = _iValue1;};
      int getValue1(void){ return iValue1;};

      protected:
      

      int iValue1;
      };

      Q_DECLARE_METATYPE(CSubclass);
      @

      Do you have any ideas? Best regards,
      Jürgen

      1 Reply Last reply Reply Quote 0
      • N
        Nierob last edited by

        You need to register a conversion function http://qt-project.org/doc/qt-5/qmetatype.html#registerConverter


        Nierob

        1 Reply Last reply Reply Quote 0
        • J
          juergenhuber last edited by

          Hey Nierob,
          thank you very much for that link. Seems promising. Unfortunately I'm using 4.4.3 in our project. The linked functionality is introduced in 5.2 - it's not easy to do an upgrade at the moment due to other external library dependencies.

          Meanwhile I found a workaround: I implemented a further USER_ROLE to handle the Basic-Object. That works and I can upgrade to your better solution after the project upgrade to > 5.2.

          Best regards,
          Jürgen

          1 Reply Last reply Reply Quote 0
          • First post
            Last post