Problem building when including a custom widget collection in Qt Creator



  • I am having a problem trying to build a Qt application that includes custom widget that is part of a CW collection. It's strange because if I open the ui file in Qt Designer and do a preview run, it works fine. The custom widget is just a label that you can click on to browse the file system and select a file.

    I am using Qt version 4.6.3

    Here is my .pro for the application

    @#-------------------------------------------------

    Project created by QtCreator 2010-08-24T17:00:51

    #-------------------------------------------------

    QT += core gui

    TARGET = BesoQt
    TEMPLATE = app

    INCLUDEPATH = ../CustomWidgets
    #LIBS = -L -lmdcustomwidgetsplugin
    #win32:LIBS += D:/Lynx/CustomWidgets-build-desktop/release/mdcustomwidgetsplugin.dll

    SOURCES +=
    projectdialog.cpp
    mainwindow.cpp
    main.cpp

    HEADERS +=
    projectdialog.h
    mainwindow.h

    FORMS +=
    projectdialog.ui
    mainwindow.ui

    RESOURCES +=
    resources.qrc
    @



  • And here is the compilation output

    @Running build steps for project CustomWidgets...
    Configuration unchanged, skipping qmake step.
    Starting: "D:/MinGW/bin/mingw32-make.exe" -w
    mingw32-make: Entering directory D:/Lynx/CustomWidgets-build-desktop' D:/MinGW/bin/mingw32-make -f Makefile.Release mingw32-make[1]: Entering directoryD:/Lynx/CustomWidgets-build-desktop'
    mingw32-make[1]: Nothing to be done for first'. mingw32-make[1]: Leaving directoryD:/Lynx/CustomWidgets-build-desktop'
    mingw32-make: Leaving directory D:/Lynx/CustomWidgets-build-desktop' The process "D:/MinGW/bin/mingw32-make.exe" exited normally. Starting: "D:/MinGW/bin/mingw32-make.exe" install -w mingw32-make: Entering directoryD:/Lynx/CustomWidgets-build-desktop'
    D:/MinGW/bin/mingw32-make -f Makefile.Release install
    mingw32-make[1]: Entering directory D:/Lynx/CustomWidgets-build-desktop' copy /y "releasemdcustomwidgetsplugin.dll" "d:Qt2010.04qtpluginsdesignermdcustomwidgetsplugin.dll" 1 file(s) copied. mingw32-make[1]: Leaving directoryD:/Lynx/CustomWidgets-build-desktop'
    mingw32-make: Leaving directory D:/Lynx/CustomWidgets-build-desktop' The process "D:/MinGW/bin/mingw32-make.exe" exited normally. Running build steps for project BesoQt... Starting: "d:/qt/2010.04/qt/bin/qmake.exe" D:/Lynx/BesoQt/BesoQt.pro -r -spec win32-g++ The process "d:/qt/2010.04/qt/bin/qmake.exe" exited normally. Starting: "D:/MinGW/bin/mingw32-make.exe" -w mingw32-make: Entering directoryD:/Lynx/BesoQt-build-desktop'
    D:/MinGW/bin/mingw32-make -f Makefile.Debug
    mingw32-make[1]: Entering directory D:/Lynx/BesoQt-build-desktop' g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -o debugprojectdialog.o ..BesoQtprojectdialog.cpp g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -o debugmainwindow.o ..BesoQtmainwindow.cpp g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -o debugmain.o ..BesoQtmain.cpp D:Qt2010.04qtbinmoc.exe -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -D__GNUC__ -DWIN32 ..BesoQtprojectdialog.h -o debugmoc_projectdialog.cpp g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -o debugmoc_projectdialog.o debugmoc_projectdialog.cpp D:Qt2010.04qtbinmoc.exe -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -D__GNUC__ -DWIN32 ..BesoQtmainwindow.h -o debugmoc_mainwindow.cpp g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -o debugmoc_mainwindow.o debugmoc_mainwindow.cpp d:Qt2010.04qtbinrcc.exe -name resources ..BesoQtresources.qrc -o debugqrc_resources.cpp g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"....Qt2010.04qtincludeQtCore" -I"....Qt2010.04qtincludeQtGui" -I"....Qt2010.04qtinclude" -I"..CustomWidgets" -I"....Qt2010.04qtincludeActiveQt" -I"debug" -I"." -I"..BesoQt" -I"." -I"....Qt2010.04qtmkspecswin32-g++" -o debugqrc_resources.o debugqrc_resources.cpp g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debugBesoQt.exe debug/projectdialog.o debug/mainwindow.o debug/main.o debug/moc_projectdialog.o debug/moc_mainwindow.o debug/qrc_resources.o -L"d:Qt2010.04qtlib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4 mingw32-make[1]: Leaving directoryD:/Lynx/BesoQt-build-desktop'
    mingw32-make: Leaving directory D:/Lynx/BesoQt-build-desktop' debug/projectdialog.o:D:LynxBesoQt-build-desktop/./ui_projectdialog.h:95: undefined reference toBrowseLabel::BrowseLabel(QWidget*)'
    collect2: ld returned 1 exit status
    mingw32-make[1]: *** [debugBesoQt.exe] Error 1
    mingw32-make: *** [debug] Error 2
    The process "D:/MinGW/bin/mingw32-make.exe" exited with code %2.
    Error while building project BesoQt (target: Desktop)
    When executing build step 'Make'@


  • Moderators

    The compilation works, so the header is found. This means your INCLUDEPATH is set up correctly.

    You get an linker error, so the binary (either a library or the object file) is not linked into your target. That hints to the LIBS variable being messed up.

    Looking at the commented out LIBS: Do you actually have a library containing your custom widget? It looks like you only build a designer plugin.

    If your widget is not depending on more customwidgets you might be able to get away with just adding the .cpp file of your widget to the SOURCES. Not necessarily the cleanest approach, but sometimes less work than building a (static or shared) library:-)



  • Tobias Hunger, thank you so much for your response.

    I was trying to include the same dll that gets installed into the qt designer directory....which I am guessing was the wrong thing to do.

    I commented out the LIBS that I had because I realized that they were not working.

    How do I go about building the actual library that contains my custom widget collection and not just the designer plugin? Can this be kicked out in the custom widget collection library project, or do I have to build each custom widget individually into it's own library.

    I need this application to have a control library because soon it will become rather large. Also the same controls will be used in another application that runs alongside this one.


  • Moderators

    Just put everything into one shared library and leave out the designer integration code:-) Should be straight forward to do with the designer plugin already working.



  • Forgive my ignorance because this is still my first week giving Qt a serious look.

    bq. Just put everything into one shared library and leave out the designer integration code

    By this, do you mean leave out the 'designer' option in the CWC .pro file's CONFIG?

    @CONFIG += designer plugin debug_and_release
    TARGET = $$qtLibraryTarget(mdcustomwidgetsplugin)
    TEMPLATE = lib

    HEADERS = browselabelplugin.h projectwidgetplugin.h mdcustomwidgets.h
    SOURCES = browselabelplugin.cpp projectwidgetplugin.cpp mdcustomwidgets.cpp
    RESOURCES = resources.qrc
    LIBS += -L.

    target.path = $$[QT_INSTALL_PLUGINS]/designer
    INSTALLS += target

    include(browselabel.pri)
    include(projectwidget.pri)
    @

    Or do you mean go through each header and source and remove the includes and macros

    So from this:
    @#ifndef BROWSELABELPLUGIN_H
    #define BROWSELABELPLUGIN_H

    #include <QDesignerCustomWidgetInterface>

    class BrowseLabelPlugin : public QObject, public QDesignerCustomWidgetInterface
    {
    Q_OBJECT
    Q_INTERFACES(QDesignerCustomWidgetInterface)

    public:
    explicit BrowseLabelPlugin(QObject *parent = 0);

    bool isContainer() const;
    bool isInitialized() const;
    QIcon icon() const;
    QString domXml() const;
    QString group() const;
    QString includeFile&#40;&#41; const;
    QString name() const;
    QString toolTip() const;
    QString whatsThis() const;
    QWidget *createWidget(QWidget *parent);
    void initialize(QDesignerFormEditorInterface *core);
    

    private:
    bool m_initialized;
    };

    #endif
    @

    I would remove :

    • #include <QDesignerCustomWidgetInterface>
    • public QDesignerCustomWidgetInterface
    • Q_INTERFACES(QDesignerCustomWidgetInterface)
    • void initialize(QDesignerFormEditorInterface *core);

  • Moderators

    You should not need the *Plugin classes at all. Those are the actual integration of your custom widgets into the Designer UI.

    So you should be fine with an new customwidgets.pro file containing the following (UNTESTED!):

    @
    TARGET = $$qtLibraryTarget(mdcustomwidgets)
    TEMPLATE = lib

    include(browselabel.pri)
    include(projectwidget.pri)
    @

    Provided that browselabel.pri and projectwidget.pri are containing the headers and sources of the widgets you want.

    You could even change the .pro-file of the plugins afterwards to link against your new library, replacing the include lines with the appropriate library information:-)

    The relevant documentation can be found "here":http://doc.qt.nokia.com/4.7-snapshot/designer-creating-custom-widgets.html.



  • Great! Thanks for you assistance, I should be able to get it working with this information.



  • Hello to everybody.
    I have the same problem of Deus Duke. I try to lead the same solution that Tobias suggest, but... don't works. Why?

    Here i explain my steps:

    1. I create a Qt Designer plugin that works fine in Qt Designer (KLineEditEx).

    2. I create a new Qt Creator project with this .pro file:

    @QT += core gui
    TARGET = $$qtLibraryTarget(Kwidgets)
    TEMPLATE = lib

    include(klineedit.pri)@

    1. I create the klineedit.pri file:

    @INCLUDEPATH += C:/Documents and Settings/glafauci/Documenti/Programmi QT/KLineEditEx
    HEADERS += ../KLineEditEx/klineeditex.h
    SOURCES += ../KLineEditEx/klineeditex.cpp@

    When I attempt to build this project, I have this answer from the compiler:

    @Running build steps for project KWidgets...
    Configuration unchanged, skipping qmake step.
    Starting: "C:/Programmi/Qt/2010.05/mingw/bin/mingw32-make.exe" -w
    mingw32-make: Entering directory `C:/Documents and Settings/glafauci/Documenti/Programmi QT/KWidgets-build-desktop'

    C:/Programmi/Qt/2010.05/mingw/bin/mingw32-make -f Makefile.Debug

    mingw32-make[1]: Entering directory `C:/Documents and Settings/glafauci/Documenti/Programmi QT/KWidgets-build-desktop'

    g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -shared -Wl,--out-implib,debug\libKwidgets.a -o debug\Kwidgets.dll debug/klineeditex.o debug/moc_klineeditex.o -L"c:\Programmi\Qt\2010.05\qt\lib" -lQtGuid4 -lQtCored4

    debug/klineeditex.o: In function `KLineEditEx':

    C:\Documents and Settings\glafauci\Documenti\Programmi QT\KWidgets-build-desktop/../KLineEditEx/klineeditex.cpp:49: undefined reference to `_imp___ZTV11KLineEditEx'

    C:\Documents and Settings\glafauci\Documenti\Programmi QT\KWidgets-build-desktop/../KLineEditEx/klineeditex.cpp:49: undefined reference to `_imp___ZTV11KLineEditEx'

    C:\Documents and Settings\glafauci\Documenti\Programmi QT\KWidgets-build-desktop/../KLineEditEx/klineeditex.cpp:49: undefined reference to `_imp___ZTV11KLineEditEx'

    C:\Documents and Settings\glafauci\Documenti\Programmi QT\KWidgets-build-desktop/../KLineEditEx/klineeditex.cpp:49: undefined reference to `_imp___ZTV11KLineEditEx'

    debug/moc_klineeditex.o:C:\Documents and Settings\glafauci\Documenti\Programmi QT\KWidgets-build-desktop/debug/moc_klineeditex.cpp:72: undefined reference to `_imp___ZN11KLineEditEx16staticMetaObjectE'

    debug/moc_klineeditex.o: In function `_static_initialization_and_destruction_0':

    Creating library file: debug\libKwidgets.a

    mingw32-make[1]: Leaving directory `C:/Documents and Settings/glafauci/Documenti/Programmi QT/KWidgets-build-desktop'

    mingw32-make: Leaving directory `C:/Documents and Settings/glafauci/Documenti/Programmi QT/KWidgets-build-desktop'

    C:\Documents and Settings\glafauci\Documenti\Programmi QT\KWidgets-build-desktop/debug/moc_klineeditex.cpp:64: undefined reference to `_imp___ZN11KLineEditEx16staticMetaObjectE'

    collect2: ld returned 1 exit status

    mingw32-make[1]: *** [debug\Kwidgets.dll] Error 1

    mingw32-make: *** [debug] Error 2

    The process "C:/Programmi/Qt/2010.05/mingw/bin/mingw32-make.exe" exited with code %2.
    Error while building project KWidgets (target: Desktop)
    When executing build step 'Make'@

    What happens?

    Thanks to all.


Log in to reply
 

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