Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. How to repaint QWidget encapsulated in QDeclarativeItem in QML?
Forum Updated to NodeBB v4.3 + New Features

How to repaint QWidget encapsulated in QDeclarativeItem in QML?

Scheduled Pinned Locked Moved Solved QML and Qt Quick
qtquick 1.0qmlqt 4.8
25 Posts 2 Posters 13.9k Views 1 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.
  • ChillaxC Chillax

    @p3c0 Yes, I call update periodically, but that does not call paint

    void FlowGrafik::refresh()
    {
        qDebug() << "refresh";
        customPlot->replot();
        customPlot->repaint();
        this->update();
    }
    

    I see "refresh" at the application output, but I don't see "paint". The question is why doesn't update call paint?

    p3c0P Offline
    p3c0P Offline
    p3c0
    Moderators
    wrote on last edited by p3c0
    #13

    @Chillax It should actually.
    http://doc.qt.io/qt-4.8/qgraphicsitem.html#painting

    Depending on whether or not the item is visible in a view, the item may or may not be repainted

    Well I guess the Item is visible.

    157

    ChillaxC 1 Reply Last reply
    1
    • p3c0P p3c0

      @Chillax It should actually.
      http://doc.qt.io/qt-4.8/qgraphicsitem.html#painting

      Depending on whether or not the item is visible in a view, the item may or may not be repainted

      Well I guess the Item is visible.

      ChillaxC Offline
      ChillaxC Offline
      Chillax
      wrote on last edited by
      #14

      @p3c0 FML :D The item is indeed visible. But it didn't help to hide it before the update and then show it again.

      I saved the pixmap to a jpg file, and it looks just as I expect it to look like. So the problem is that the QML won't repaint the QDeclaretiveItem, because it is visible... Can you think of a better solution for displaying my QCustomPlot Qwidget? I am pretty sure this is possibe in QML, and it shouldn't be this hard.

      p3c0P 1 Reply Last reply
      0
      • ChillaxC Chillax

        @p3c0 FML :D The item is indeed visible. But it didn't help to hide it before the update and then show it again.

        I saved the pixmap to a jpg file, and it looks just as I expect it to look like. So the problem is that the QML won't repaint the QDeclaretiveItem, because it is visible... Can you think of a better solution for displaying my QCustomPlot Qwidget? I am pretty sure this is possibe in QML, and it shouldn't be this hard.

        p3c0P Offline
        p3c0P Offline
        p3c0
        Moderators
        wrote on last edited by
        #15

        @Chillax

        So the problem is that the QML won't repaint the QDeclaretiveItem, because it is visible...

        No. It's useless painting invisible objects.

        Can you try following ?

        • On the QML side specify width and height for FlowGrafik item. May be this could be the reason the item is not painted i.e having width and height as 0 is close to having an invisible item.

        • Create a very minimal project with QDeclarativeItem and without using QCustomPlot and keeping rest the same. This is to make sure if paint method is invoked atleast in this case. I dont have Qt 4.8 at hand so I can't test. Have moved to Qt5 long time back :)

        157

        ChillaxC 1 Reply Last reply
        1
        • p3c0P p3c0

          @Chillax

          So the problem is that the QML won't repaint the QDeclaretiveItem, because it is visible...

          No. It's useless painting invisible objects.

          Can you try following ?

          • On the QML side specify width and height for FlowGrafik item. May be this could be the reason the item is not painted i.e having width and height as 0 is close to having an invisible item.

          • Create a very minimal project with QDeclarativeItem and without using QCustomPlot and keeping rest the same. This is to make sure if paint method is invoked atleast in this case. I dont have Qt 4.8 at hand so I can't test. Have moved to Qt5 long time back :)

          ChillaxC Offline
          ChillaxC Offline
          Chillax
          wrote on last edited by
          #16

          @p3c0 Unfortunately specifying with and height did not solve the issue.

          I created a minimal project (with QtQuick Application template). It is using QCustomPlot and everything works fine. But this is a Desktop version, and if I am not mistaken it is using Qt 5.3, but I need it to work on my embedded linux Qt 4.8 version.
          The embedded linux version uses qmlapplicationviewer to load QML files with this comment on top:

          # This file was generated by the Qt Quick Application wizard of Qt Creator.
          # The code below adds the QmlApplicationViewer to the project and handles the
          # activation of QML debugging.
          

          the desktop version uses qtquickapplicationviewer:

          # This file was generated by the Qt Quick 1 Application wizard of Qt Creator.
          # The code below adds the QtQuick1ApplicationViewer to the project.
          

          I'm not sure if the applicationviewer or the qt version difference causes my problem.

          p3c0P 1 Reply Last reply
          0
          • ChillaxC Chillax

            @p3c0 Unfortunately specifying with and height did not solve the issue.

            I created a minimal project (with QtQuick Application template). It is using QCustomPlot and everything works fine. But this is a Desktop version, and if I am not mistaken it is using Qt 5.3, but I need it to work on my embedded linux Qt 4.8 version.
            The embedded linux version uses qmlapplicationviewer to load QML files with this comment on top:

            # This file was generated by the Qt Quick Application wizard of Qt Creator.
            # The code below adds the QmlApplicationViewer to the project and handles the
            # activation of QML debugging.
            

            the desktop version uses qtquickapplicationviewer:

            # This file was generated by the Qt Quick 1 Application wizard of Qt Creator.
            # The code below adds the QtQuick1ApplicationViewer to the project.
            

            I'm not sure if the applicationviewer or the qt version difference causes my problem.

            p3c0P Offline
            p3c0P Offline
            p3c0
            Moderators
            wrote on last edited by
            #17

            @Chillax
            qtquickapplicationviewer was a helper class added back then which calls other in-built functions to load QML files. It also provided some extra functions for ease. You can also directly use QQuickView or QQmlApplicationEngine to load the QML files depending upon the root object. This is all Qt 5.x related.
            Similarly qmlapplicationviewer is an helper class. If you look into its source you can see it is actually subclassed from QDeclarativeView which actually loads and displays the QML files.

            I'm not sure if the applicationviewer or the qt version difference causes my problem.

            AFAIK definitely not applicationviewer but may be Qt version.

            Also did you try running same application with Qt 4.8 on desktop ? I think you should try that too to rule out the system problem if any.

            157

            ChillaxC 2 Replies Last reply
            1
            • p3c0P p3c0

              @Chillax
              qtquickapplicationviewer was a helper class added back then which calls other in-built functions to load QML files. It also provided some extra functions for ease. You can also directly use QQuickView or QQmlApplicationEngine to load the QML files depending upon the root object. This is all Qt 5.x related.
              Similarly qmlapplicationviewer is an helper class. If you look into its source you can see it is actually subclassed from QDeclarativeView which actually loads and displays the QML files.

              I'm not sure if the applicationviewer or the qt version difference causes my problem.

              AFAIK definitely not applicationviewer but may be Qt version.

              Also did you try running same application with Qt 4.8 on desktop ? I think you should try that too to rule out the system problem if any.

              ChillaxC Offline
              ChillaxC Offline
              Chillax
              wrote on last edited by
              #18

              @p3c0 So I spent the last couple of hours trying to find out how to install Qt version 4.8 on Ubuntu, but it turns out that only the versions newer than 5.0 support linux. So I installed Qt Creator and Qt version 4.8 on Windows and it works there as well :)

              1 Reply Last reply
              0
              • p3c0P p3c0

                @Chillax
                qtquickapplicationviewer was a helper class added back then which calls other in-built functions to load QML files. It also provided some extra functions for ease. You can also directly use QQuickView or QQmlApplicationEngine to load the QML files depending upon the root object. This is all Qt 5.x related.
                Similarly qmlapplicationviewer is an helper class. If you look into its source you can see it is actually subclassed from QDeclarativeView which actually loads and displays the QML files.

                I'm not sure if the applicationviewer or the qt version difference causes my problem.

                AFAIK definitely not applicationviewer but may be Qt version.

                Also did you try running same application with Qt 4.8 on desktop ? I think you should try that too to rule out the system problem if any.

                ChillaxC Offline
                ChillaxC Offline
                Chillax
                wrote on last edited by
                #19

                @p3c0 Interesting news: Until now, my QmlApplicationViewer flowView was just a new window on top of the GUI I was using until now. But if I show only flowView in fullscreen and nothing else, it works (updates/repaints).

                qmlRegisterType<FlowGrafik>("FlowGrafik",1,0,"FlowGrafik");
                QmlApplicationViewer flowView;
                flowView.setSource(QUrl("qrc:///qml/qml/FlowView.qml"));
                flowView.showFullScreen();
                
                ChillaxC 1 Reply Last reply
                1
                • ChillaxC Chillax

                  @p3c0 Interesting news: Until now, my QmlApplicationViewer flowView was just a new window on top of the GUI I was using until now. But if I show only flowView in fullscreen and nothing else, it works (updates/repaints).

                  qmlRegisterType<FlowGrafik>("FlowGrafik",1,0,"FlowGrafik");
                  QmlApplicationViewer flowView;
                  flowView.setSource(QUrl("qrc:///qml/qml/FlowView.qml"));
                  flowView.showFullScreen();
                  
                  ChillaxC Offline
                  ChillaxC Offline
                  Chillax
                  wrote on last edited by
                  #20

                  @p3c0 What's more interesting: If I call addFlow from QML, it works (replots). But if I call it from C++, it updates the QWidget, but not the QML Item. Even if I call refresh() from QML right after it, which should replot and repaint the QML Item too. Any explanation to this? Why is there a difference between changing the QWidget in the C++ code and asking for a replot from QML and doing everything in QML? As if the QML Item and the C++ QDeclarativeItem were two independent objects.

                  So now my plan is to give the flow value from C++ to the FlowGrafik QML item, and then call addFlow from QML. That should work.

                  p3c0P 1 Reply Last reply
                  0
                  • ChillaxC Chillax

                    @p3c0 What's more interesting: If I call addFlow from QML, it works (replots). But if I call it from C++, it updates the QWidget, but not the QML Item. Even if I call refresh() from QML right after it, which should replot and repaint the QML Item too. Any explanation to this? Why is there a difference between changing the QWidget in the C++ code and asking for a replot from QML and doing everything in QML? As if the QML Item and the C++ QDeclarativeItem were two independent objects.

                    So now my plan is to give the flow value from C++ to the FlowGrafik QML item, and then call addFlow from QML. That should work.

                    p3c0P Offline
                    p3c0P Offline
                    p3c0
                    Moderators
                    wrote on last edited by
                    #21

                    @Chillax Unfortunately I too dont understand this behavior. The fact that it works in desktop environment and not on embedded only points that there should be some bug in that environment.

                    So now my plan is to give the flow value from C++ to the FlowGrafik QML item, and then call addFlow from QML.

                    Try. I had suggested the same earlier :)
                    Let us know if it works or if possible the exact reason so that it may help others too.

                    157

                    ChillaxC 1 Reply Last reply
                    1
                    • p3c0P p3c0

                      @Chillax Unfortunately I too dont understand this behavior. The fact that it works in desktop environment and not on embedded only points that there should be some bug in that environment.

                      So now my plan is to give the flow value from C++ to the FlowGrafik QML item, and then call addFlow from QML.

                      Try. I had suggested the same earlier :)
                      Let us know if it works or if possible the exact reason so that it may help others too.

                      ChillaxC Offline
                      ChillaxC Offline
                      Chillax
                      wrote on last edited by
                      #22

                      @p3c0 So thanks a lot for the help! I would have given up without you :) The problem was that I created two instances of FlowGrafik. One in the QML and one in C++. I changed the C++ one and expected the QML one to refresh.

                      Now I created a pointer in the C++ code that points to the Item in the QML.

                      QmlApplicationViewer flowView;
                      flowView.setSource(QUrl("qrc:///qml/qml/FlowView.qml"));
                      QObject * flowViewObject = flowView.rootObject();
                      FlowGrafik * flowGrafik = flowViewObject->findChild<FlowGrafik *>(QString("FlowGrafik"));
                      

                      But now if I want to use this pointer (like flowGrafik->addFlow(...)) I get a segmentation fault. Do you know why?

                      p3c0P 1 Reply Last reply
                      0
                      • ChillaxC Chillax

                        @p3c0 So thanks a lot for the help! I would have given up without you :) The problem was that I created two instances of FlowGrafik. One in the QML and one in C++. I changed the C++ one and expected the QML one to refresh.

                        Now I created a pointer in the C++ code that points to the Item in the QML.

                        QmlApplicationViewer flowView;
                        flowView.setSource(QUrl("qrc:///qml/qml/FlowView.qml"));
                        QObject * flowViewObject = flowView.rootObject();
                        FlowGrafik * flowGrafik = flowViewObject->findChild<FlowGrafik *>(QString("FlowGrafik"));
                        

                        But now if I want to use this pointer (like flowGrafik->addFlow(...)) I get a segmentation fault. Do you know why?

                        p3c0P Offline
                        p3c0P Offline
                        p3c0
                        Moderators
                        wrote on last edited by
                        #23

                        @Chillax Thank you :)

                        The problem was that I created two instances of FlowGrafik. One in the QML and one in C++. I changed the C++ one and expected the QML one to refresh.

                        but now this makes me wonder as to why it worked on desktop.

                        But now if I want to use this pointer (like flowGrafik->addFlow(...)) I get a segmentation fault. Do you know why?

                        Was the FlowGrafik object found ? You can add a small condition to verify it.

                        if(flowGrafik) {
                           flowGrafik->addFlow(...)
                        }
                        

                        157

                        ChillaxC 1 Reply Last reply
                        1
                        • p3c0P p3c0

                          @Chillax Thank you :)

                          The problem was that I created two instances of FlowGrafik. One in the QML and one in C++. I changed the C++ one and expected the QML one to refresh.

                          but now this makes me wonder as to why it worked on desktop.

                          But now if I want to use this pointer (like flowGrafik->addFlow(...)) I get a segmentation fault. Do you know why?

                          Was the FlowGrafik object found ? You can add a small condition to verify it.

                          if(flowGrafik) {
                             flowGrafik->addFlow(...)
                          }
                          
                          ChillaxC Offline
                          ChillaxC Offline
                          Chillax
                          wrote on last edited by
                          #24

                          @p3c0 You are right, it was not found, because it was actually the rootobject, not a child :) Thanks again for the help!

                          p3c0P 1 Reply Last reply
                          0
                          • ChillaxC Chillax

                            @p3c0 You are right, it was not found, because it was actually the rootobject, not a child :) Thanks again for the help!

                            p3c0P Offline
                            p3c0P Offline
                            p3c0
                            Moderators
                            wrote on last edited by
                            #25

                            @Chillax You're Welcome :)

                            157

                            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