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 = appINCLUDEPATH = ../CustomWidgets
#LIBS = -L -lmdcustomwidgetsplugin
#win32:LIBS += D:/Lynx/CustomWidgets-build-desktop/release/mdcustomwidgetsplugin.dllSOURCES +=
projectdialog.cpp
mainwindow.cpp
main.cppHEADERS +=
projectdialog.h
mainwindow.hFORMS +=
projectdialog.ui
mainwindow.uiRESOURCES +=
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 directoryD:/Lynx/CustomWidgets-build-desktop' D:/MinGW/bin/mingw32-make -f Makefile.Release mingw32-make[1]: Entering directory
D:/Lynx/CustomWidgets-build-desktop'
mingw32-make[1]: Nothing to be done forfirst'. mingw32-make[1]: Leaving directory
D:/Lynx/CustomWidgets-build-desktop'
mingw32-make: Leaving directoryD:/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 directory
D:/Lynx/CustomWidgets-build-desktop'
D:/MinGW/bin/mingw32-make -f Makefile.Release install
mingw32-make[1]: Entering directoryD:/Lynx/CustomWidgets-build-desktop' copy /y "releasemdcustomwidgetsplugin.dll" "d:Qt2010.04qtpluginsdesignermdcustomwidgetsplugin.dll" 1 file(s) copied. mingw32-make[1]: Leaving directory
D:/Lynx/CustomWidgets-build-desktop'
mingw32-make: Leaving directoryD:/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 directory
D:/Lynx/BesoQt-build-desktop'
D:/MinGW/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directoryD:/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 directory
D:/Lynx/BesoQt-build-desktop'
mingw32-make: Leaving directoryD:/Lynx/BesoQt-build-desktop' debug/projectdialog.o:D:LynxBesoQt-build-desktop/./ui_projectdialog.h:95: undefined reference to
BrowseLabel::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'@ -
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.
-
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 = libHEADERS = 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 += targetinclude(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() 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);
-
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 = libinclude(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.
-
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:
-
I create a Qt Designer plugin that works fine in Qt Designer (KLineEditEx).
-
I create a new Qt Creator project with this .pro file:
@QT += core gui
TARGET = $$qtLibraryTarget(Kwidgets)
TEMPLATE = libinclude(klineedit.pri)@
- 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.
-