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. Find those properties of a widget which are shown in the Qt Designer
Forum Updated to NodeBB v4.3 + New Features

Find those properties of a widget which are shown in the Qt Designer

Scheduled Pinned Locked Moved Solved General and Desktop
16 Posts 3 Posters 2.6k 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.
  • M mrjj
    26 Mar 2019, 18:01

    @Eager
    Hmm. Im not sure how the Designer does it.
    I tried to look around in
    https://code.woboq.org/qt5/qt-creator/src/plugins/designer/
    but found nothing.

    E Offline
    E Offline
    Eager
    wrote on 26 Mar 2019, 18:12 last edited by Eager
    #7

    @mrjj Right now I am trying to look around in
    https://code.woboq.org/qt5/qttools/src/designer/src/
    Can you please look around in this one too, if you don't mind?

    M 1 Reply Last reply 26 Mar 2019, 18:15
    0
    • E Eager
      26 Mar 2019, 18:12

      @mrjj Right now I am trying to look around in
      https://code.woboq.org/qt5/qttools/src/designer/src/
      Can you please look around in this one too, if you don't mind?

      M Offline
      M Offline
      mrjj
      Lifetime Qt Champion
      wrote on 26 Mar 2019, 18:15 last edited by
      #8

      @Eager
      sure. if we can find the actual property widget we should get a clue.

      1 Reply Last reply
      0
      • S Offline
        S Offline
        SGaist
        Lifetime Qt Champion
        wrote on 26 Mar 2019, 18:35 last edited by
        #9

        Hi,

        IIRC, that's because you are parsing the current class meta object for properties.

        You have go back the chain up to the "root" meta object.

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

        E 2 Replies Last reply 26 Mar 2019, 18:40
        0
        • S SGaist
          26 Mar 2019, 18:35

          Hi,

          IIRC, that's because you are parsing the current class meta object for properties.

          You have go back the chain up to the "root" meta object.

          E Offline
          E Offline
          Eager
          wrote on 26 Mar 2019, 18:40 last edited by Eager
          #10

          @SGaist For finding only those properties of QPushButton which the Qt Designer displays in Property Editor, I am currently doing like this:

              qDebug()<<qPrintable("Widget: QPushButton");
              QObject *object = new QPushButton;
              const QMetaObject *metaobject = object->metaObject();
              for (int i=0; i<metaobject->propertyCount(); ++i) {
                  QMetaProperty metaproperty = metaobject->property(i);
                  qDebug()<<metaproperty.isStored();
                  if(metaproperty.isWritable() && metaproperty.isDesignable()) {
                      qDebug()<<qPrintable(QString(metaproperty.name()) + " : " + QString(metaproperty.typeName()));
                  }
              }
          

          Can you please point out where I am doing wrong?

          1 Reply Last reply
          0
          • S SGaist
            26 Mar 2019, 18:35

            Hi,

            IIRC, that's because you are parsing the current class meta object for properties.

            You have go back the chain up to the "root" meta object.

            E Offline
            E Offline
            Eager
            wrote on 26 Mar 2019, 19:01 last edited by
            #11

            @SGaist

            You have go back the chain up to the "root" meta object.

            How can I do this? I wish I knew this concept! :(
            Can you please explain this or share a sample code?
            I am already highly obliged!

            1 Reply Last reply
            0
            • S Offline
              S Offline
              SGaist
              Lifetime Qt Champion
              wrote on 26 Mar 2019, 21:58 last edited by
              #12

              To go through the chain, use QMetaObject::superClass.

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

              E 1 Reply Last reply 27 Mar 2019, 07:12
              1
              • S SGaist
                26 Mar 2019, 21:58

                To go through the chain, use QMetaObject::superClass.

                E Offline
                E Offline
                Eager
                wrote on 27 Mar 2019, 07:12 last edited by
                #13

                @SGaist I tried that and I noticed that QMetaObject::superClass() gives me the properties of the base classes of the widget in question. I went through the chain in a loop and displayed the properties of each level and I found that properties like windowModality, windowFilePath, windowModified, windowTitle etc. are defined inside the base classes alongwith many other which should be displayed for the QPushButton in the Qt Designer.
                I think Qt Designer uses some kind of fuzzy logic and somehow suppresses some of the properties for the child widgets.

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on 27 Mar 2019, 21:49 last edited by
                  #14

                  What are the differences ?

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

                  E 1 Reply Last reply 28 Mar 2019, 08:13
                  0
                  • E Eager
                    26 Mar 2019, 09:06

                    How can I find only those properties of a widget (e.g. QPushButton) which Qt Designer shows in the Property Editor?
                    I can find all properties including those which are not shown in the Qt Designer using the following code:

                        // Print all available properties of a Widget:
                        qDebug()<<qPrintable("Widget: QPushButton");
                        QObject *object = new QPushButton;
                        const QMetaObject *metaobject = object->metaObject();
                        for (int i=0; i<metaobject->propertyCount(); ++i) {
                            QMetaProperty metaproperty = metaobject->property(i);
                            const char *name = metaproperty.name();
                            QVariant value = object->property(name);
                            qDebug()<<qPrintable("\n" + QString(name) + "\n" + QString(value.typeName()));
                        }
                    
                    E Offline
                    E Offline
                    Eager
                    wrote on 28 Mar 2019, 08:09 last edited by Eager
                    #15

                    At last I found a working solution. Of course, it has some limitations but works for my use case.

                        // Print all those properties of a widget which are shown in the Qt Designer:
                    
                        /* Main Container is the widget having no parent.
                         * Main Container has the following extra properties:
                         *  - windowTitle
                         *  - windowIcon
                         *  - windowIconText
                         *  - windowOpacity
                         *  - windowModified
                         *  - windowFilePath
                         *
                         * In a ui form there can only be one Main Container.
                         *
                         * As we want to get the properties of the widgets which are not designed/intended
                         * to be used as Main Container of a ui form so to avoid getting the above extra
                         * properties we make them children of a fake main container widget.
                         *
                         * Qt Designer does not show read only properties so make sure you display only those
                         * properties which are both readable and writable.
                         *
                         * Note also that property visibility in the Qt Designer can be set ON and OFF by
                         * other properties. For example checked property is designable only if boolean
                         * property setCheckable is set to true.
                         *
                         * As you can notice in the files:
                         * qt5/qttools/src/designer/src/lib/shared/qdesigner_propertysheet.cpp
                         * qt5/qttools/src/designer/src/components/formeditor/qdesigner_resource.cpp
                         * that windowModality is set Visible only for the Main Container so manually remove that
                         * property whenever you find it for the children widgets.
                         */
                           QWidget *fakeMainContainerWidget = new QWidget(); // No parent means main container.
                           QObject *object = new QPushButton(fakeMainContainerWidget);
                           const QMetaObject *metaobject = object->metaObject();
                           qDebug() << qPrintable("-==" + QString(metaobject->className()) + " ==-");
                           for (int i=0; i<metaobject->propertyCount(); ++i) {
                               QMetaProperty metaproperty = metaobject->property(i);
                               bool isReadOnly = metaproperty.isReadable() && !metaproperty.isWritable();
                               bool isWinModal = metaproperty.name() == QString("windowModality"); // removed windowModality manually
                               if( !isReadOnly && metaproperty.isDesignable(object) && !isWinModal ) {
                                   qDebug() <<  qPrintable(QString(metaproperty.name()) + " : " + QString(metaproperty.typeName()));
                               }
                           }
                    
                    1 Reply Last reply
                    0
                    • S SGaist
                      27 Mar 2019, 21:49

                      What are the differences ?

                      E Offline
                      E Offline
                      Eager
                      wrote on 28 Mar 2019, 08:13 last edited by Eager
                      #16

                      @SGaist I came up with a solution and I have posted it in this thread.

                      1 Reply Last reply
                      1

                      16/16

                      28 Mar 2019, 08:13

                      • Login

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