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. Convert QVariantList to QList<Type> list
QtWS25 Last Chance

Convert QVariantList to QList<Type> list

Scheduled Pinned Locked Moved General and Desktop
qvariantlist ql
23 Posts 4 Posters 26.6k 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.
  • I Offline
    I Offline
    ikim
    wrote on last edited by SGaist
    #1

    Hi All

    I have a QVariantList which is passed as a parameter to my function.

    void myfunc(const QVariantList &list)
    {
      // I want to convert this to  QList<Type> newList
      // where Type is the type() of list.at(0)
      // the variant list consists of variants all of the same type 
    }
    

    What I want to do is

    QList<Type> newList;   //how do I declare this if I dont know the Type
      foreach(QVariant v, list) 
        newList << v.value();
    

    Then create a QSet from the newList

    Is there a way of easily achieving this

    Regards

    Ikim

    MayEnjoyM 1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi and welcome to devnet,

      Do you mean

      QSet<Type> newSet = newList.toSet();
      

      ?

      If so, why not:

      QSet<Type> newSet;
      foreach(QVariant v, list) {
          newSet << v.value<Type>();
      }
      

      ?

      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
      • I Offline
        I Offline
        ikim
        wrote on last edited by
        #3

        Hi and thanks

        How do I declare QSet<Type> at compile time when I dont know Type

        Thanks

        M 1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          What is your use case ?

          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
          • I ikim

            Hi and thanks

            How do I declare QSet<Type> at compile time when I dont know Type

            Thanks

            M Offline
            M Offline
            mcosta
            wrote on last edited by
            #5

            @ikim said:

            How do I declare QSet<Type> at compile time when I dont know Type

            You can't! In C++ you must define the type of templates.

            Question: Why cannot you use QSet<QVariant>??

            Once your problem is solved don't forget to:

            • Mark the thread as SOLVED using the Topic Tool menu
            • Vote up the answer(s) that helped you to solve the issue

            You can embed images using (http://imgur.com/) or (http://postimage.org/)

            1 Reply Last reply
            0
            • I Offline
              I Offline
              ikim
              wrote on last edited by
              #6

              Hi

              I need to compare two variantlist both containing variants of the same type and determine the variants that are common to both lists

              Thanks

              1 Reply Last reply
              0
              • M Offline
                M Offline
                mcosta
                wrote on last edited by
                #7

                You can use QVariant directly without conversion because QVariant supports operator==()

                Once your problem is solved don't forget to:

                • Mark the thread as SOLVED using the Topic Tool menu
                • Vote up the answer(s) that helped you to solve the issue

                You can embed images using (http://imgur.com/) or (http://postimage.org/)

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  QVariant has the == operator

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  I 1 Reply Last reply
                  0
                  • SGaistS SGaist

                    QVariant has the == operator

                    I Offline
                    I Offline
                    ikim
                    wrote on last edited by
                    #9

                    @SGaist yes I could compare each QVariant in the list but that would mean iterating over the entire list to determine if the item exists in the second list. Is that my only option ?

                    Thanks

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      No, use the QSet features e.g.

                      QSet<QVariant> commonSet = mySet1 & mySet2;
                      

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      I 1 Reply Last reply
                      0
                      • SGaistS SGaist

                        No, use the QSet features e.g.

                        QSet<QVariant> commonSet = mySet1 & mySet2;
                        
                        I Offline
                        I Offline
                        ikim
                        wrote on last edited by
                        #11

                        @SGaist Thanks, so I can use a QSet<QVariant> out of the box ?

                        other forums are suggesting that I need to define a qhash() function for the QVariant.

                        1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          mcosta
                          wrote on last edited by
                          #12

                          QSet is based on a hash table; this means that internally it uses qHash()

                          Once your problem is solved don't forget to:

                          • Mark the thread as SOLVED using the Topic Tool menu
                          • Vote up the answer(s) that helped you to solve the issue

                          You can embed images using (http://imgur.com/) or (http://postimage.org/)

                          I 1 Reply Last reply
                          0
                          • I ikim

                            Hi All

                            I have a QVariantList which is passed as a parameter to my function.

                            void myfunc(const QVariantList &list)
                            {
                              // I want to convert this to  QList<Type> newList
                              // where Type is the type() of list.at(0)
                              // the variant list consists of variants all of the same type 
                            }
                            

                            What I want to do is

                            QList<Type> newList;   //how do I declare this if I dont know the Type
                              foreach(QVariant v, list) 
                                newList << v.value();
                            

                            Then create a QSet from the newList

                            Is there a way of easily achieving this

                            Regards

                            Ikim

                            MayEnjoyM Offline
                            MayEnjoyM Offline
                            MayEnjoy
                            wrote on last edited by
                            #13

                            @ikim why not use QVariant::Type method? even you can use it with c++ template.

                            I am a engineer.

                            I 1 Reply Last reply
                            0
                            • M mcosta

                              QSet is based on a hash table; this means that internally it uses qHash()

                              I Offline
                              I Offline
                              ikim
                              wrote on last edited by
                              #14

                              @mcosta Thanks but this gives a compile error

                              QSet<QVariant> existingValues;
                              existingValues.insert(1);

                              1 Reply Last reply
                              0
                              • MayEnjoyM MayEnjoy

                                @ikim why not use QVariant::Type method? even you can use it with c++ template.

                                I Offline
                                I Offline
                                ikim
                                wrote on last edited by
                                #15

                                @MayEnjoy Thanks, but how would this enable me to achieve my goal ?

                                MayEnjoyM 1 Reply Last reply
                                0
                                • M Offline
                                  M Offline
                                  mcosta
                                  wrote on last edited by
                                  #16

                                  Which kind of error?

                                  Once your problem is solved don't forget to:

                                  • Mark the thread as SOLVED using the Topic Tool menu
                                  • Vote up the answer(s) that helped you to solve the issue

                                  You can embed images using (http://imgur.com/) or (http://postimage.org/)

                                  I 1 Reply Last reply
                                  0
                                  • M mcosta

                                    Which kind of error?

                                    I Offline
                                    I Offline
                                    ikim
                                    wrote on last edited by
                                    #17

                                    @mcosta /usr/include/QtCore/qhash.h:882:24: error: no matching function for call to 'qHash(const QVariant&)'

                                    1 Reply Last reply
                                    0
                                    • M Offline
                                      M Offline
                                      mcosta
                                      wrote on last edited by
                                      #18

                                      mmmm, You're right.

                                      So I suggest to create a template method

                                      This code works for me

                                      template <typename T>
                                      QSet<T> mergeList(const QVariantList& l1, const QVariantList& l2) {
                                          QSet<T> s1, s2;
                                      
                                          for (const QVariant& v: l1) {
                                              s1.insert(v.value<T>());
                                          }
                                      
                                          for (const QVariant& v: l2) {
                                              s2.insert(v.value<T>());
                                          }
                                      
                                          return s1 & s2;
                                      }
                                      

                                      Used as

                                          QVariantList l1, l2;
                                          l1 << 1 << 2 << 3;
                                          l2 << 1 << 3 << 5;
                                      
                                          QSet<int> s1 = mergeList<int> (l1, l2);
                                          qDebug() << s1;
                                      
                                          l1.clear();
                                          l2.clear();
                                      
                                          l1 << "Foo" << "Bar";
                                          l2 << "Bar" << "Fred";
                                      
                                          QSet<QString> s2 = mergeList<QString> (l1, l2);
                                          qDebug() << s2;
                                      

                                      Once your problem is solved don't forget to:

                                      • Mark the thread as SOLVED using the Topic Tool menu
                                      • Vote up the answer(s) that helped you to solve the issue

                                      You can embed images using (http://imgur.com/) or (http://postimage.org/)

                                      I 1 Reply Last reply
                                      1
                                      • M mcosta

                                        mmmm, You're right.

                                        So I suggest to create a template method

                                        This code works for me

                                        template <typename T>
                                        QSet<T> mergeList(const QVariantList& l1, const QVariantList& l2) {
                                            QSet<T> s1, s2;
                                        
                                            for (const QVariant& v: l1) {
                                                s1.insert(v.value<T>());
                                            }
                                        
                                            for (const QVariant& v: l2) {
                                                s2.insert(v.value<T>());
                                            }
                                        
                                            return s1 & s2;
                                        }
                                        

                                        Used as

                                            QVariantList l1, l2;
                                            l1 << 1 << 2 << 3;
                                            l2 << 1 << 3 << 5;
                                        
                                            QSet<int> s1 = mergeList<int> (l1, l2);
                                            qDebug() << s1;
                                        
                                            l1.clear();
                                            l2.clear();
                                        
                                            l1 << "Foo" << "Bar";
                                            l2 << "Bar" << "Fred";
                                        
                                            QSet<QString> s2 = mergeList<QString> (l1, l2);
                                            qDebug() << s2;
                                        
                                        I Offline
                                        I Offline
                                        ikim
                                        wrote on last edited by
                                        #19

                                        @mcosta Thanks for your effort, but this still doesn't solve the problem as I dont know the Type at compile time

                                        1 Reply Last reply
                                        1
                                        • M Offline
                                          M Offline
                                          mcosta
                                          wrote on last edited by
                                          #20

                                          Hi,

                                          I'm not a C++ super-guru but I don't think you can do it because the compiler must know the type of each variable at compile time.

                                          A solution could be implement qHash(const QVariant &v) and use QSet<QVariant>

                                          Once your problem is solved don't forget to:

                                          • Mark the thread as SOLVED using the Topic Tool menu
                                          • Vote up the answer(s) that helped you to solve the issue

                                          You can embed images using (http://imgur.com/) or (http://postimage.org/)

                                          I 1 Reply Last reply
                                          1

                                          • Login

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