Cannot include QDeclarative Item



  • i m trying to initialize QtDEclarative objects, i was following this link:
    Link: http://qt-project.org/doc/qt-4.8/qtbinding.html
    But its giving me a lot of errors

    @#include "detectsquares.h"
    #include "message.h"
    #include <QDeclarativeItem>
    #include <QDeclarativeComponent>
    #include <QUrl>

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);--
    QQmlApplicationEngine engine;
    QDeclarativeEngine enge= new QDeclarativeEngine();
    QDeclarativeComponent component(&engine,
    QUrl::fromLocalFile("main.qml"));
    return app.exec();
    @


  • Moderators

    Hi,

    You are mixing Qt 4.8 and Qt 5 components. Use either one. QQmlApplicationEngine is based on Qt5 and QDeclarativeEngine, QDeclarativeComponent is based on Qt4. The recommended way is to use QQmlApplicationEngine and QQmlComponent.
    Follow "this":http://doc.qt.io/qt-5/qqmlapplicationengine.html and "this":http://doc.qt.io/qt-5/qqmlcomponent.html.



  • But i want to access the Qml objects that is why i was following the above mentioned link, i want to change the image source in the Qml by invoking a c++ functiion that will edit the current image and then access that image property using QDeclarativeitem method in that link, how should i do this?


  • Moderators

    Are you using Qt5 or Qt4 ?



  • Qt 5.4


  • Moderators

    So donot use QDeclarative* classes. Use Qt5 supported one.

    bq. i want to change the image source in the Qml by invoking a c++ functiion that will edit the current image

    To do this Qt5 way, first go through "Interacting with QML Objects from C++":http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html and "Integrating QML and C++":http://doc.qt.io/qt-5/qtqml-cppintegration-topic.html.


  • Moderators

    To clarify p3c0's words:

    • Classes named QDeclarative[X] are obsolete. You should use them with Qt 4, but you should not use them with Qt 5.
    • For Qt 5, use classes named QQml[X] and QQuick[X].

    [quote author="Javeria" date="1424320806"]i m trying to initialize QtDEclarative objects, i was following this link:
    Link: http://qt-project.org/doc/qt-4.8/qtbinding.html
    [/quote]That link is for Qt 4. Do not follow it.

    Use p3c0's links instead.



  • Thanks a lot for the guidance but i dont have a lot of time and i have like an hour to complete this so if you guys could help in the setting of context property that i cant seem to set context propert its giving me this: error: C2227: left of '->setContextProperty' must point to class/struct/union/generic type
    when i declare this:
    @ QQmlEngine eng;
    DetectSquares m;
    eng.rootContext()->setContextProperty("m",&m);
    QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));
    component.create();
    @


  • Moderators

    [quote author="Javeria" date="1424331653"]error: C2227: left of '- >setContextProperty' must point to class/struct/union/generic type[/quote]That means your compiler doesn't recognize the item on the left of '->setContextProperty'. Did you #include <QQmlContext>?



  • Okay done!!, but i have to now call DetectSquares objects function iside QML file, but its givng me syntax error and i dont know how should i set the signal its really confusing :
    Here s is the DetectSqaure.h
    @#ifndef DETECTSQUARES_H
    #define DETECTSQUARES_H
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"

    #include <iostream>

    using namespace cv;
    using namespace std;

    #include <QObject>

    class DetectSquares: public QObject
    {
    Q_OBJECT
    public:
    double angle(Point pt1, Point pt2, Point pt0);
    void findSquares(Mat image);
    static void drawSquares(Mat& image, const vector<vector<Point> >& squares);
    void Detect(Mat image);
    bool proximity(Size rect1, Size rect2);
    Rect proximity_rect(Rect rect1, Rect rect2);
    Rect is_a_box(Point cp);
    vector<vector<Point>> squares;
    Mat image;
    Point prev_pointer;
    vector<Rect> Detected;
    int y;

    };

    #endif // DETECTSQUARES_H
    @
    Hers the Qml Code:
    @import QtQuick 2.4
    import QtQuick.Controls 1.3
    import QtQuick.Window 2.2
    import QtQuick.Dialogs 1.2
    import QtQuick 2.0
    ApplicationWindow {
    title: qsTr("Sketch_it")
    width: 1500
    height: 1000
    visible: true
    property var imagesListModel: ["file:/original.jpg","file:/11.jpg","file:/test (1).jpg","file:/test (2).jpg","file:/test (3).jpg","file:/test (4).jpg","file:/test (5).jpg"]
    ListView {
    id: imagesList
    anchors.fill:parent
    spacing:25
    orientation: Qt.Vertical
    model: imagesListModel
    delegate: Image {
    objectName: "Displayimage"
    width: 75
    height: 100
    source: imagesListModel[index]
    Text{
    text:"Sketch"+(index+1)
    }

             MouseArea {
                 anchors.fill: parent
    
                 onClicked: {
                    main.source=imagesListModel[index]
                    Component.OnCompleted:{
                     m.Detect();
                     }
                   // console.log("User select '"+"' image");
                 }
             }
        }
    }
    Image{
        id:main
        width: 700
        height: 600
    
       // source:"file:/test (6).jpg"
        anchors.centerIn: parent
        MouseArea{
          anchors.fill:parent
           onClicked: {
    
    
               console.log(mouseX+" "+mouseY);
         }
        }
    }
    

    }
    @


  • Moderators

    You will need to make those methods "Q_INVOKABLE":http://doc.qt.io/qt-5/qobject.html#Q_INVOKABLE. An example of how to access them is "here":http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html#exposing-methods-including-qt-slots.
    But beware that QML recognizes only the "following":http://doc.qt.io/qt-5/qtqml-cppintegration-data.html#basic-qt-data-types data types. So it wont recongnize those OpenCV's user defined data types.



  • I ve kinda follwoed it, i dnt have enough time , i have 5 min, heres the code, its giving me syntax error when i use Component.onCompleted:
    @import QtQuick 2.4
    import QtQuick.Controls 1.3
    import QtQuick.Window 2.2
    import QtQuick.Dialogs 1.2
    import QtQuick 2.0
    ApplicationWindow {
    title: qsTr("Sketch_it")
    width: 1500
    height: 1000
    visible: true
    property var imagesListModel: ["file:/original.jpg","file:/11.jpg","file:/test (1).jpg","file:/test (2).jpg","file:/test (3).jpg","file:/test (4).jpg","file:/test (5).jpg"]
    ListView {
    id: imagesList
    anchors.fill:parent
    spacing:25
    orientation: Qt.Vertical
    model: imagesListModel
    delegate: Image {
    objectName: "Displayimage"
    width: 75
    height: 100
    source: imagesListModel[index]
    Text{
    text:"Sketch"+(index+1)
    }

             MouseArea {
                 anchors.fill: parent
    
                 onClicked: {
                    main.source=imagesListModel[index]
                    Component.OnCompleted:
                     {
                         m.Detect();
                     }
                   // console.log("User select '"+"' image");
                 }
             }
        }
    }
    Image{
        id:main
        width: 700
        height: 600
    
       // source:"file:/test (6).jpg"
        anchors.centerIn: parent
        MouseArea{
          anchors.fill:parent
           onClicked: {
    
    
               console.log(mouseX+" "+mouseY);
         }
        }
    }
    

    }
    @


  • Moderators

    Ofcourse it will.
    @
    void Detect(Mat image);
    @

    Takes an argument and you are not supplying it. Plus it takes an argument not recognized by QML. You will need to find another way to pass the data from QML to C++ and which is recognized by both.



  • Okay but there is still syntax error in this
    @Component.OnCompleted:
    {

      }@

  • Moderators

    • Component.onCompleted is a signal handler.
    • onClicked is a signal handler.

    You cannot put a signal handler inside another signal handler. You need to move Component.onCompleted up one level, at least.


  • Moderators

    [quote author="JKSH" date="1424387370"]* Component.onCompleted is a signal handler.

    • onClicked is a signal handler.

    You cannot put a signal handler inside another signal handler. You need to move Component.onCompleted up one level, at least.
    [/quote]

    Right. I missed that one.



  • Okay but i have two call two c++ functions, and one should be called when the user clicks on the main image so i cant use component.oncompleted thn?


  • Moderators

    Call that function in onClicked event handler. Component.onCompleted is called after the object has been instantiated. You can call the function inside it also but since you need to do it on click, call it inside onClicked.


  • Moderators

    [quote author="Javeria" date="1424418592"]Okay but i have two call two c++ functions, and one should be called when the user clicks on the main image so i cant use component.oncompleted thn?[/quote]As the name implies, Component.onCompleted runs when the component has finished loading.

    Do you want your function to be called when the component finishes loading?



  • And also i have changed my detectsquare function's parameters to Qimage
    so that i could use the current selected image in that function but i dont understand how i should do that in QML? As i cant use Qimage object in QML


  • Moderators

    Since you already have paths, you can just send the path string from QML to C++ and then there access that image.



  • But I want to edit that image and send it back to qml so that it displays it in the ui


  • Moderators

    Do you have paths for the Images in QML ?

    If yes, then as said earlier, send the path string from QML to C++, open the image, process it, on C++ side(or whatever operations), then signal QML to display that image.


  • Moderators

    Read the blog post and the comments at http://pusling.com/blog/?p=369



  • I have decided to use Qstring and i have followed this link to assign path:
    Link: http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html (The properties part)
    But im getting this error
    Invalid attached object assignment

    QQmlComponent: Component is not ready



  • @onClicked: {
    m.image=imagesListModel[index];
    main.source=m.imagesListModel[index]

                   // console.log("User select '"+"' image");
                 }@
    

    m is the Detectsquares object and i m setting the path and then assigning the path to the main image
    Here is the code im main.cpp:
    @
    QApplication app(argc, argv);
    // QQmlEngine eng;

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    DetectSquares m;
    engine.rootContext()->setContextProperty("m",&m);
     QQmlComponent component(&engine, QUrl::fromLocalFile&#40;"qrc:/main.qml"&#41;);
     component.create();
    

    @


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.