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. (solved) Screenshot in qml

(solved) Screenshot in qml

Scheduled Pinned Locked Moved QML and Qt Quick
18 Posts 5 Posters 10.6k 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.
  • D Offline
    D Offline
    daljit97
    wrote on last edited by
    #1
    This post is deleted!
    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #2

      [quote author="daljit97" date="1339960006"]but i'm getting many errors.[/quote]

      Any news on what the errors actually are?

      (Z(:^

      1 Reply Last reply
      0
      • sierdzioS Offline
        sierdzioS Offline
        sierdzio
        Moderators
        wrote on last edited by
        #3

        Line 11. is very, very strange. Why do you pass the QDeclarativeView to ::grabWidget()? Should it not be a real object? And why do you return QPixMap and then not do anything with it (line 11 of QML file)?

        (Z(:^

        1 Reply Last reply
        0
        • P Offline
          P Offline
          Peppy
          wrote on last edited by
          #4

          @bool QPixmap::save(QString file);@ returns bool, not QPixmap.

          1 Reply Last reply
          0
          • D Offline
            D Offline
            daljit97
            wrote on last edited by
            #5

            Thanks. I have done many errors because i'm new to c++ and qt. I've tried Peppy code but it anyhow shows these errors: invalid use of QPixmap::save; expected primary expressions before 'bool'.

            1 Reply Last reply
            0
            • P Offline
              P Offline
              Peppy
              wrote on last edited by
              #6

              I would suggest you to look firstly at pure C++ basics of OOP, because this is not good way how to teach you, how to use C++ neither Qt/QML...

              We could teach you here basics of language C++, but it's not good idea, because there are tons of tutorials and basics of C++ on the Internet...you should google it first.

              I think, tutorials will be better than "try and hope" programming.

              The whole function written above is logically wrong... that's all what I would say to that. And to that error. You can not use QDeclarativeView as stand-alone name for something - that's the reason why it was expecting something more (name of variable) - that is one of the basics for C++.

              Best regards,
              Peppy.

              1 Reply Last reply
              0
              • D Offline
                D Offline
                daljit97
                wrote on last edited by
                #7

                I was trying it because i need it in qml app, but thanks anyhow.

                1 Reply Last reply
                0
                • D Offline
                  D Offline
                  daljit97
                  wrote on last edited by
                  #8

                  --Update: I’ve corrected some errors but doesn’t work yet.

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    Peppy
                    wrote on last edited by
                    #9

                    how does it look like after you have rewritten it?

                    1 Reply Last reply
                    0
                    • D Offline
                      D Offline
                      DigitalPioneer
                      wrote on last edited by
                      #10

                      I wrote a class to acquire a screenshot in QML once. It's designed for QtQuick 1.1, I haven't updated it for 2.0. Here's the code:

                      screensnapper.h
                      @
                      #ifndef SCREENSNAPPER_H
                      #define SCREENSNAPPER_H

                      #include <QDeclarativeImageProvider>

                      class ScreenSnapper : public QDeclarativeImageProvider
                      {
                      public:
                      ScreenSnapper();

                      QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);
                      

                      };

                      #endif // SCREENSNAPPER_H
                      @

                      screensnapper.cpp
                      @

                      #include "screensnapper.h"

                      #include "QApplication"
                      #include "QDesktopWidget"

                      ScreenSnapper::ScreenSnapper()
                      : QDeclarativeImageProvider(QDeclarativeImageProvider::Pixmap)
                      {
                      }

                      QPixmap ScreenSnapper::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
                      {
                      *size = QApplication::desktop()->size();
                      return QPixmap::grabWindow(QApplication::desktop()->winId());
                      }
                      @

                      Use it in QML like so:
                      @
                      Image {
                      id: desktopSnapshot
                      source: "image://snapper/snapshot"
                      anchors.fill: parent
                      }
                      @

                      See how that does for you. :)

                      EDIT: Oops, I forgot the code to register it... Assuming your QDeclarativeView is called view, you'll need to do this before you load the QML:
                      @view->engine()->addImageProvider(QString("snapper"), new ScreenSnapper());@

                      1 Reply Last reply
                      0
                      • D Offline
                        D Offline
                        daljit97
                        wrote on last edited by
                        #11

                        thank you very much, but i'm getting this little error(I'm getting errors and errors also with little things these days): base operand of '->' has non-pointer type 'QDeclarativeView'
                        Here's code.

                        @#include <QtGui/QApplication>
                        #include "qmlapplicationviewer.h"
                        #include "screensnapper.h"
                        Q_DECL_EXPORT int main(int argc, char *argv[])
                        {
                        QScopedPointer<QApplication> app(createApplication(argc, argv));

                        QmlApplicationViewer viewer;
                        viewer.setMainQmlFile&#40;QLatin1String("qml/untitled18/main.qml"&#41;);
                        viewer.showExpanded();
                        QDeclarativeView view;
                        view->engine()->addImageProvider(QString("snapper"), new ScreenSnapper());
                        return app->exec&#40;&#41;;
                        

                        }@

                        1 Reply Last reply
                        0
                        • D Offline
                          D Offline
                          DigitalPioneer
                          wrote on last edited by
                          #12

                          OK, that's not going to work; you're creating a worthless QDeclarativeView. You need to get the engine from the actual QML viewer and set the image provider before loading the QML, like so:

                          @
                          #include <QtGui/QApplication>
                          #include "qmlapplicationviewer.h"
                          #include "screensnapper.h"
                          Q_DECL_EXPORT int main(int argc, char *argv[])
                          {
                          QScopedPointer<QApplication> app(createApplication(argc, argv));

                          QmlApplicationViewer viewer;
                          viewer.engine()->addImageProvider(QString("snapper"), new ScreenSnapper());
                          viewer.setMainQmlFile&#40;QLatin1String("qml/untitled18/main.qml"&#41;);
                          viewer.showExpanded();
                          
                          return app->exec&#40;&#41;;
                          

                          }
                          @

                          The error you received was simply pointing out that you were using the dereferencing member selection operator (->) when you didn't have a pointer to an object, you just had the object. In that case, you would need to use the normal member selection operator, which is a dot.

                          1 Reply Last reply
                          0
                          • D Offline
                            D Offline
                            daljit97
                            wrote on last edited by
                            #13

                            I've already tried it before your post but it was showing this errors(it's a malediction): -invalid use of incomplete type 'structQDeclarativeEngine'(line 9) & -forward declaration of 'structQDeclarativeEngine'

                            1 Reply Last reply
                            0
                            • D Offline
                              D Offline
                              DigitalPioneer
                              wrote on last edited by
                              #14

                              Now it's angry because the compiler doesn't actually know what QDeclarativeEngine is -- you need to include the header for it:

                              @#include <QDeclarativeEngine>@

                              1 Reply Last reply
                              0
                              • D Offline
                                D Offline
                                daljit97
                                wrote on last edited by
                                #15

                                Error: QML Image: Failed to get image from provider: image://snapper/snapshot.
                                P.S. : thanks to be so patient.
                                EDIT: It works perfectly on a symbian phone. It doesn't work in Qtsimulator.

                                1 Reply Last reply
                                0
                                • D Offline
                                  D Offline
                                  daljit97
                                  wrote on last edited by
                                  #16

                                  Any way to save it to the phone memory?

                                  1 Reply Last reply
                                  0
                                  • D Offline
                                    D Offline
                                    DigitalPioneer
                                    wrote on last edited by
                                    #17

                                    You can look into the QtMobility stuff, but I would just write that in C++ personally.

                                    1 Reply Last reply
                                    0
                                    • D Offline
                                      D Offline
                                      Djay96
                                      wrote on last edited by
                                      #18

                                      this is simple code from which i get snapshot

                                      int main(int argc, char *argv[])
                                      {
                                      QApplication app(argc, argv);

                                      QDeclarativeView *view = new QDeclarativeView();
                                      

                                      view->setSource(QUrl::fromLocalFile("inputQMLFile.qml")); //inputQMLFile.qml instead your QML file that will generate Image

                                      QPixmap::grabWidget(view).save("outputFile.png"); //Output file where you want to store the image
                                      }

                                      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