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. Create a plugins
Forum Updated to NodeBB v4.3 + New Features

Create a plugins

Scheduled Pinned Locked Moved General and Desktop
35 Posts 4 Posters 13.7k 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.
  • G Offline
    G Offline
    goli
    wrote on last edited by
    #1

    i create 2 projects. in the first project i create few objects(declerativeItems) and used the qmlRegisterType to create the connection to qml.
    now i would like to use this objects in the second project, without to include the files in the pro file.....
    how can i do that correctly?
    i tried to use the CONFIG += ... but this does not work.

    1 Reply Last reply
    0
    • L Offline
      L Offline
      loladiro
      wrote on last edited by
      #2

      Use INCLUDEPATH, LIBS and make sure your first program exports all the necessary objects you want to use in your second plugin (like you would if you were building a shared library).
      That means in your first program you have to have something like:
      .pro
      @
      DEFINES += MY_LIBRARY
      @
      global.h
      @
      #include <QtCore/qglobal.h>

      #if defined(MY_LIBRARY)

      define MYSHARED_EXPORT Q_DECL_EXPORT

      #else

      define MYSHARED_EXPORT Q_DECL_IMPORT

      #endif
      @
      And your classes with
      @
      class MYSHARED_EXPORT class1
      @

      And you should adjust the defines (MY_LIBRARY, MYSHARED_EXPORT) to fit your plugin, they should be different for every lib you do.

      1 Reply Last reply
      0
      • Z Offline
        Z Offline
        ZapB
        wrote on last edited by
        #3

        This "article":http://developer.qt.nokia.com/doc/qt-4.7/qml-extending-tutorial-index.html explains how to extend QML using C++ and in particular section 6 shows you how to make your custom QDeclarative items into a reusable plugin.

        Nokia Certified Qt Specialist
        Interested in hearing about Qt related work

        1 Reply Last reply
        0
        • G Offline
          G Offline
          goli
          wrote on last edited by
          #4

          in the second project- when i want to use the objects from the first project in qml file , i got this error: module "Operands" is not installed - for the line : import Operands 1.0
          i created an object OperandItem in the 1st project, and write :
          qmlRegisterType<OperandItem> ("Operands", 1, 0, "MYOperand");

          and i am trying to use this from the qml in the 2nd project... in the qml the MYOperand is known, but i got this error .

          1 Reply Last reply
          0
          • Z Offline
            Z Offline
            ZapB
            wrote on last edited by
            #5

            Did you follow the steps in the docs? ie have you actually made a plugin (a shared lib that can be loaded by your 2nd project)?

            Nokia Certified Qt Specialist
            Interested in hearing about Qt related work

            1 Reply Last reply
            0
            • G Offline
              G Offline
              goli
              wrote on last edited by
              #6
              1. in the 1st project i write :

              @
              #if defined(MY_NGWIDGETS_LIBRARY)

              define MYSHARED_EXPORT Q_DECL_EXPORT

              #else

              define MYSHARED_EXPORT Q_DECL_IMPORT

              #endif

              class MYSHARED_EXPORT MyClass{...}
              @

              for each class that i want to use in the 2nd project.

              2.in the pro file (of the 1st project) i write:
              @
              TARGET = NGWidgets
              TEMPLATE = app
              DEFINES += MY_NGWIDGETS_LIBRARY
              CONFIG += qt plugin
              DESTDIR = app
              OBJECTS_DIR = tmp
              MOC_DIR = tmp
              @

              1. i also create a qmldir file and write:

              @
              plugin NGWidgets-plugins app
              @

              then i tried to use the plugin from the 2nd project.
              but it still say that the modules are not installed

              Edit: Please use @ tags to delimit blocks of code etc.

              1 Reply Last reply
              0
              • Z Offline
                Z Offline
                ZapB
                wrote on last edited by
                #7

                Well for a start the 1st project needs to have
                @
                TEMPLATE = lib
                @
                rather than "app" since you are trying to make a plugin which is a shared library.

                Nokia Certified Qt Specialist
                Interested in hearing about Qt related work

                1 Reply Last reply
                0
                • G Offline
                  G Offline
                  goli
                  wrote on last edited by
                  #8

                  now i got this error:
                  The process could not be started: The system cannot find the file specified. - for the line:
                  @DESTDIR = lib

                  1 Reply Last reply
                  0
                  • Z Offline
                    Z Offline
                    ZapB
                    wrote on last edited by
                    #9

                    What process? Can you post your 2 projects please? Either that or be alot more descriptive in what you are doing. You are not giving us enough information to understand what the problem is.

                    You will not be able to execute your 1st project since that will just be a plugin library not an application.

                    Nokia Certified Qt Specialist
                    Interested in hearing about Qt related work

                    1 Reply Last reply
                    0
                    • G Offline
                      G Offline
                      goli
                      wrote on last edited by
                      #10

                      1st project:

                      operanditem.h

                      @ #if defined(MY_NGWIDGETS_LIBRARY)

                      define MYSHARED_EXPORT Q_DECL_EXPORT

                      #else

                      define MYSHARED_EXPORT Q_DECL_IMPORT

                      #endif

                      class MYSHARED_EXPORT OperandItem : public QObject
                      {.....}@

                      main.c

                      @qmlRegisterType<OperandItem> (“Operands”, 1, 0, “MYOperand”);@

                      pro file

                      @QT += core gui
                      QT += declarative
                      QT += network
                      QT += xml

                      TARGET = NGWidgets
                      TEMPLATE = lib
                      DEFINES += MY_NGWIDGETS_LIBRARY
                      CONFIG += qt plugin
                      DESTDIR = lib
                      OBJECTS_DIR = tmp
                      MOC_DIR = tmp

                      SOURCES +=
                      main.cpp \
                      Operands/operanditem.cpp
                      HEADERS +=
                      Operands/operanditem.h

                      @

                      2nd project:

                      in some qml file i write:

                      @ import QtQuick 1.0
                      import Operands 1.0

                      Rectangle{
                      MYOperand{}
                      }@

                      1 Reply Last reply
                      0
                      • L Offline
                        L Offline
                        lgeyer
                        wrote on last edited by
                        #11

                        You better append your second .pro file too.

                        1 Reply Last reply
                        0
                        • Z Offline
                          Z Offline
                          ZapB
                          wrote on last edited by
                          #12

                          Please have another read through this "article":http://developer.qt.nokia.com/doc/qt-4.7/declarative-tutorials-extending-chapter6-plugins.html#id-8c522ec4-43c2-4344-a4a4-148efcc18b7d and you'll see that you also need to write a plugin class derived from QDeclarativeExtensionPlugin that your 2nd project's QML engine will call the registerTypes() function of in order to register them with your 2nd project.

                          This plugin class seems to be completely missing from you 1st project.

                          Nokia Certified Qt Specialist
                          Interested in hearing about Qt related work

                          1 Reply Last reply
                          0
                          • G Offline
                            G Offline
                            goli
                            wrote on last edited by
                            #13

                            i have this class inherit from QDeclarativeExtensionPlugin and create the plugin.
                            i don't know what i need to add to the 2nd project (in the pro file) to make it work with the new module...

                            1 Reply Last reply
                            0
                            • Z Offline
                              Z Offline
                              ZapB
                              wrote on last edited by
                              #14

                              You need to edit the qmldir file in your 2nd project so that it points at the path where the plugin library from your 1st project is located.

                              Nokia Certified Qt Specialist
                              Interested in hearing about Qt related work

                              1 Reply Last reply
                              0
                              • G Offline
                                G Offline
                                goli
                                wrote on last edited by
                                #15

                                the dll file was created in the build-desktop directory(in the debug) and not in the QtCreator\lib\ directory... even when i copy the dll to this place it does not work

                                1 Reply Last reply
                                0
                                • G Offline
                                  G Offline
                                  goli
                                  wrote on last edited by
                                  #16

                                  in the pro file i write:

                                  @QTPLUGIN += NGWidgets
                                  LIBS += -L"C:/Qt/Projects/NGWidgets-build-desktop/debug"
                                  LIBS += -lNGWidgets@

                                  in the folder "C:/Qt/Projects/NGWidgets-build-desktop/debug"
                                  i have the dll (NGWidgets.dll)

                                  but i got the error:
                                  :-1: error: cannot find -lngwidgetsd
                                  collect2: ld returned 1 exit status

                                  1 Reply Last reply
                                  0
                                  • Z Offline
                                    Z Offline
                                    ZapB
                                    wrote on last edited by
                                    #17

                                    I don't think that your 2nd project's .pro file needs to mention the NGWidgets plugin lib at all. The qmldir file tells the QDeclarativeEngine where it can dllopen your plugin library from.

                                    Also the error message you posted does not match the .pro file you have posted the error message is referring to ngwidgetsd.dll whereas the .pro file mentions NGWidgets.dll (not the trailing d).

                                    In your 1st project (the plugin one) make sure you are using the Q_EXPORT_PLUGIN2 macro as is mentioned in the docs:

                                    @
                                    Q_EXPORT_PLUGIN2( NGWidgets, NGWidgetsPlugin )
                                    @

                                    where I have assumed that your plugin class (the one derived from QDeclarativeExtensionPlugin) is called NGWidgetsPlugin (since you have not shown it to us).

                                    Try using a qmldir file for your 2d project that looks like this:

                                    @
                                    plugin NGWidgets C:/Qt/Projects/NGWidgets-build-desktop/debug
                                    @

                                    and in your .qml file using

                                    @
                                    import NGWidgets 1.0
                                    @

                                    Nokia Certified Qt Specialist
                                    Interested in hearing about Qt related work

                                    1 Reply Last reply
                                    0
                                    • G Offline
                                      G Offline
                                      goli
                                      wrote on last edited by
                                      #18

                                      that exaclly what i did - and i create alse qmldir file in the first project (as shown in the example)....

                                      in this link : http://doc.qt.nokia.com/latest/plugins-howto.html
                                      they say that the pro file of the 2nd project should be changed...

                                      1 Reply Last reply
                                      0
                                      • Z Offline
                                        Z Offline
                                        ZapB
                                        wrote on last edited by
                                        #19

                                        I do not see anything in that document relating to qml plugins. Rather than this constant back and forth can you provide a zip file of your two projects that we can try to fix up for you please?

                                        Nokia Certified Qt Specialist
                                        Interested in hearing about Qt related work

                                        1 Reply Last reply
                                        0
                                        • G Offline
                                          G Offline
                                          goli
                                          wrote on last edited by
                                          #20

                                          i can't post all my code. but this is the main classes:

                                          1st project :

                                          ngwidgetsplugin.h

                                          @#include <QDeclarativeExtensionPlugin>

                                          class NGWidgetsPlugin: public QDeclarativeExtensionPlugin
                                          {
                                          Q_OBJECT
                                          public:
                                          void registerTypes(const char *uri);
                                          };@

                                          ngwidgetsplugin.cpp

                                          @#include <QtDeclarative>
                                          #include <QtPlugin>
                                          //.....more includes for files

                                          void NGWidgetsPlugin::registerTypes(const char *uri)
                                          {
                                          qmlRegisterType<OperandItem> (uri, 1, 0, "MYOperand");

                                             //................. 
                                          

                                          }

                                          Q_EXPORT_PLUGIN2(NGWidgets, NGWidgetsPlugin)@

                                          .pro

                                          @QT += core gui
                                          QT += declarative
                                          QT += network

                                          #TARGET = NGWidgets
                                          TEMPLATE = lib
                                          CONFIG += qt plugin
                                          DESTDIR = lib
                                          OBJECTS_DIR = tmp
                                          MOC_DIR = tmp

                                          SOURCES += ...
                                          HEADERS += ...
                                          OTHER_FILES += ...
                                          @

                                          qmldir

                                          @plugin NGWidgets lib@

                                          2nd project - use the plugin

                                          .pro

                                          @QT += core gui
                                          QT += declarative
                                          QT += network

                                          SOURCES += ...
                                          HEADERS += ...
                                          OTHER_FILES += ...@

                                          qmldir

                                          @plugin NGWidgets C:/Qt/Projects/NGWidgets-build-desktop/debug @

                                          app.qml

                                          @import QtQuick 1.0
                                          import NGWidgets 1.0

                                          Rectangle
                                          {
                                          MYOperand{...}
                                          }

                                          @

                                          i got the error : module "NGWidgets" is not installed
                                          for line 2

                                          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