From: Enar Väikene <enar@vaikene.net>
Date: Thu, 7 Nov 2013 12:01:25 +0000 (+0200)
Subject: Ported to Qt5
X-Git-Url: https://www.vaikene.ee/gitweb/pswgen10.html?a=commitdiff_plain;h=a81a943bee20df3c7eb34bafb3e3fe878facfe4e;p=evaf

Ported to Qt5
Currently missing Qt plugin loading using eVaf XML files.
---

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e7b58d0..7fbcdd6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,17 +1,22 @@
 project(eVaf)
 
-set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required
-cmake_minimum_required(VERSION 2.6.0)
+cmake_minimum_required(VERSION 2.8.9)
 
 if(COMMAND cmake_policy)
     cmake_policy(SET CMP0003 NEW)
+    cmake_policy(SET CMP0020 NEW)
 endif(COMMAND cmake_policy)
 
+# Find Qt packages
+find_package(Qt5Core REQUIRED)
+find_package(Qt5Xml REQUIRED)
+find_package(Qt5Widgets)
+find_package(Qt5Sql)
+
 # Include our own cmake modules
 set(CMAKE_MODULE_PATH ${eVaf_SOURCE_DIR}/mk/cmake)
 
-# Find Qt4
-find_package(Qt4 4.6 REQUIRED)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 # Default to the Debug build type if none is specified
 IF(NOT CMAKE_BUILD_TYPE)
diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt
index 65cc4c4..d9521a3 100644
--- a/src/apps/CMakeLists.txt
+++ b/src/apps/CMakeLists.txt
@@ -1,5 +1,7 @@
-add_subdirectory(PswGen)
+if(Qt5Sql_FOUND)
+  add_subdirectory(PswGen)
+endif(Qt5Sql_FOUND)
 add_subdirectory(FileFinder)
-if(QT_QTGUI_FOUND)
+if(Qt5Widgets_FOUND)
   add_subdirectory(ScosTime)
-endif(QT_QTGUI_FOUND)
+endif(Qt5Widgets_FOUND)
diff --git a/src/apps/FileFinder/CMakeLists.txt b/src/apps/FileFinder/CMakeLists.txt
index 1e6d01c..3b7324f 100644
--- a/src/apps/FileFinder/CMakeLists.txt
+++ b/src/apps/FileFinder/CMakeLists.txt
@@ -1,6 +1,6 @@
 set(eVaf_INCLUDE ${eVaf_INCLUDE} ${CMAKE_SOURCE_DIR}/src/apps/FileFinder)
 
 add_subdirectory(Engine)
-if(QT_QTGUI_FOUND)
+if(Qt5Widgets_FOUND)
   add_subdirectory(GUI)
-endif(QT_QTGUI_FOUND)
+endif(Qt5Widgets_FOUND)
diff --git a/src/apps/FileFinder/Engine/CMakeLists.txt b/src/apps/FileFinder/Engine/CMakeLists.txt
index af9c24a..310d509 100644
--- a/src/apps/FileFinder/Engine/CMakeLists.txt
+++ b/src/apps/FileFinder/Engine/CMakeLists.txt
@@ -2,8 +2,8 @@
 set(TARGET FileFinderEngine)
 
 # Qt modules
-set(QT_DONT_USE_QTGUI TRUE)
-include(${QT_USE_FILE})
+#set(QT_DONT_USE_QTGUI TRUE)
+#include(${QT_USE_FILE})
 
 # Needed for exporting/importing symbols
 add_definitions(-DFILEFINDER_ENGINE_LIBRARY)
@@ -30,10 +30,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/apps/FileFinder/Engine/engine.cpp b/src/apps/FileFinder/Engine/engine.cpp
index 5c79cfd..bd15220 100644
--- a/src/apps/FileFinder/Engine/engine.cpp
+++ b/src/apps/FileFinder/Engine/engine.cpp
@@ -19,7 +19,6 @@
 
 
 #include "engine.h"
-#include "version.h"
 
 #include <Common/iLogger>
 #include <Common/iRegistry>
@@ -27,7 +26,6 @@
 #include <QtCore>
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::FileFinder::Engine::Module)
 
 using namespace eVaf;
 using namespace eVaf::FileFinder;
diff --git a/src/apps/FileFinder/Engine/engine.h b/src/apps/FileFinder/Engine/engine.h
index 341df0a..a17d3cc 100644
--- a/src/apps/FileFinder/Engine/engine.h
+++ b/src/apps/FileFinder/Engine/engine.h
@@ -21,6 +21,7 @@
 #  define __FILEFINDER_ENGINE_ENGINE_H
 
 #include "ifilefinder.h"
+#include "version.h"
 
 #include <Plugins/iPlugin>
 
@@ -62,6 +63,7 @@ class Module : public Plugins::iPlugin
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPlugin)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/apps/FileFinder/GUI/CMakeLists.txt b/src/apps/FileFinder/GUI/CMakeLists.txt
index 56b5db4..3c9d64c 100644
--- a/src/apps/FileFinder/GUI/CMakeLists.txt
+++ b/src/apps/FileFinder/GUI/CMakeLists.txt
@@ -2,7 +2,7 @@
 set(TARGET FileFinderGui)
 
 # Qt modules
-include(${QT_USE_FILE})
+#include(${QT_USE_FILE})
 
 # Include files
 include_directories(${eVaf_INCLUDE})
@@ -30,12 +30,14 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_add_resources(RCC_SRCS ${RCCS})
+qt5_add_resources(RCC_SRCS ${RCCS})
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS} ${RCC_SRCS})
 
+qt5_use_modules(${TARGET} Core Widgets)
+
 target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/apps/FileFinder/GUI/gui.cpp b/src/apps/FileFinder/GUI/gui.cpp
index e664dd7..9574df1 100644
--- a/src/apps/FileFinder/GUI/gui.cpp
+++ b/src/apps/FileFinder/GUI/gui.cpp
@@ -18,7 +18,6 @@
  */
 
 #include "gui.h"
-#include "version.h"
 
 #include "Engine/iFileFinder"
 
@@ -28,10 +27,9 @@
 #include <Common/iApp>
 #include <SdiWindow/iSdiWindow>
 
-#include <QtGui>
+#include <QtWidgets>
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::FileFinder::GUI::Module)
 
 using namespace eVaf;
 
@@ -44,7 +42,7 @@ void FileFinder::GUI::Internal::MainWidget::keyPressEvent(QKeyEvent * e)
         switch (e->key()) {
             case Qt::Key_Enter:
             case Qt::Key_Return: {
-                QList<QPushButton *> buttons = qFindChildren<QPushButton *>(this);
+                QList<QPushButton *> buttons = findChildren<QPushButton *>();
                 foreach (QPushButton * btn, buttons) {
                     if (btn->isDefault() && btn->isVisible()) {
                         if (btn->isEnabled())
diff --git a/src/apps/FileFinder/GUI/gui.h b/src/apps/FileFinder/GUI/gui.h
index 4d22d0b..283b167 100644
--- a/src/apps/FileFinder/GUI/gui.h
+++ b/src/apps/FileFinder/GUI/gui.h
@@ -20,6 +20,8 @@
 #ifndef __FILEFINDER_GUI_GUI_H
 #  define __FILEFINDER_GUI_GUI_H
 
+#include "version.h"
+
 #include <Plugins/iPlugin>
 #include <Gui/Panel>
 
@@ -82,6 +84,7 @@ class Module : public Plugins::iPlugin
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPlugin)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/apps/PswGen/CLI/CMakeLists.txt b/src/apps/PswGen/CLI/CMakeLists.txt
index ef8ee22..8629168 100644
--- a/src/apps/PswGen/CLI/CMakeLists.txt
+++ b/src/apps/PswGen/CLI/CMakeLists.txt
@@ -1,10 +1,6 @@
 # Name of the target
 set(TARGET PswCli)
 
-# Qt modules
-set(QT_DONT_USE_QTGUI TRUE)
-include(${QT_USE_FILE})
-
 # Include files
 include_directories(${eVaf_INCLUDE})
 
@@ -26,10 +22,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/apps/PswGen/CLI/cli.cpp b/src/apps/PswGen/CLI/cli.cpp
index 51ea2b6..56a49fb 100644
--- a/src/apps/PswGen/CLI/cli.cpp
+++ b/src/apps/PswGen/CLI/cli.cpp
@@ -18,7 +18,6 @@
  */
 
 #include "cli.h"
-#include "version.h"
 
 #include <Generator/iGenerator>
 #include <Storage/iStorage>
@@ -42,7 +41,6 @@
 #endif
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::PswGen::CLI::Module)
 
 
 //-------------------------------------------------------------------
diff --git a/src/apps/PswGen/CLI/cli.h b/src/apps/PswGen/CLI/cli.h
index 9747565..cf53859 100644
--- a/src/apps/PswGen/CLI/cli.h
+++ b/src/apps/PswGen/CLI/cli.h
@@ -20,6 +20,8 @@
 #ifndef __PSWGEN_CLI_CLI_H
 #  define __PSWGEN_CLI_CLI_H
 
+#include "version.h"
+
 #include <Plugins/iPlugin>
 
 #include <QObject>
@@ -46,6 +48,7 @@ class Module : public Plugins::iPlugin
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPlugin)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/apps/PswGen/CMakeLists.txt b/src/apps/PswGen/CMakeLists.txt
index 3eadf22..d612852 100644
--- a/src/apps/PswGen/CMakeLists.txt
+++ b/src/apps/PswGen/CMakeLists.txt
@@ -1,8 +1,8 @@
 set(eVaf_INCLUDE ${eVaf_INCLUDE} ${CMAKE_SOURCE_DIR}/src/apps/PswGen)
 
-if(QT_QTGUI_FOUND)
+if(Qt5Widgets_FOUND)
   add_subdirectory(GUI)
-endif(QT_QTGUI_FOUND)
+endif(Qt5Widgets_FOUND)
 add_subdirectory(CLI)
 add_subdirectory(Generator)
 add_subdirectory(Storage)
diff --git a/src/apps/PswGen/GUI/CMakeLists.txt b/src/apps/PswGen/GUI/CMakeLists.txt
index 561060e..89e9473 100644
--- a/src/apps/PswGen/GUI/CMakeLists.txt
+++ b/src/apps/PswGen/GUI/CMakeLists.txt
@@ -1,9 +1,6 @@
 # Name of the target
 set(TARGET PswGui)
 
-# Qt modules
-include(${QT_USE_FILE})
-
 # Include files
 include_directories(${eVaf_INCLUDE})
 
@@ -25,10 +22,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Widgets)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/apps/PswGen/GUI/gui.cpp b/src/apps/PswGen/GUI/gui.cpp
index 9ab2645..6f94ce9 100644
--- a/src/apps/PswGen/GUI/gui.cpp
+++ b/src/apps/PswGen/GUI/gui.cpp
@@ -18,7 +18,6 @@
  */
 
 #include "gui.h"
-#include "version.h"
 
 #include "Generator/iGenerator"
 #include "Storage/iStorage"
@@ -29,11 +28,10 @@
 #include <SdiWindow/iSdiWindow>
 #include <Gui/Panel>
 
-#include <QtGui>
+#include <QtWidgets>
 
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::PswGen::GUI::Module)
 
 
 //-------------------------------------------------------------------
diff --git a/src/apps/PswGen/GUI/gui.h b/src/apps/PswGen/GUI/gui.h
index 246b556..f4abd24 100644
--- a/src/apps/PswGen/GUI/gui.h
+++ b/src/apps/PswGen/GUI/gui.h
@@ -20,6 +20,8 @@
 #ifndef __PSWGEN_GUI_GUI_H
 #define __PSWGEN_GUI_GUI_H
 
+#include "version.h"
+
 #include <Plugins/iPlugin>
 
 #include <QObject>
@@ -45,6 +47,7 @@ class Module : public Plugins::iPlugin
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPlugin)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/apps/PswGen/Generator/CMakeLists.txt b/src/apps/PswGen/Generator/CMakeLists.txt
index 3d7c7eb..c4ca65f 100644
--- a/src/apps/PswGen/Generator/CMakeLists.txt
+++ b/src/apps/PswGen/Generator/CMakeLists.txt
@@ -1,10 +1,6 @@
 # Name of the target
 set(TARGET PswGen)
 
-# Qt modules
-set(QT_DONT_USE_QTGUI TRUE)
-include(${QT_USE_FILE})
-
 # Needed for exporting/importing symbols
 add_definitions(-DPSWGEN_GENERATOR_LIBRARY)
 
@@ -29,10 +25,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/apps/PswGen/Generator/module.cpp b/src/apps/PswGen/Generator/module.cpp
index 9e24e56..bca1954 100644
--- a/src/apps/PswGen/Generator/module.cpp
+++ b/src/apps/PswGen/Generator/module.cpp
@@ -18,7 +18,6 @@
  */
 
 #include "module.h"
-#include "version.h"
 
 #include <Common/iLogger>
 #include <Common/iRegistry>
@@ -26,7 +25,6 @@
 #include <QtCore>
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::PswGen::Generator::Module)
 
 using namespace eVaf;
 using namespace eVaf::PswGen;
diff --git a/src/apps/PswGen/Generator/module.h b/src/apps/PswGen/Generator/module.h
index 90affff..68cdb4c 100644
--- a/src/apps/PswGen/Generator/module.h
+++ b/src/apps/PswGen/Generator/module.h
@@ -21,6 +21,7 @@
 #  define __PSWGEN_GENERATOR_MODULE_H
 
 #include "igenerator.h"
+#include "version.h"
 
 #include <Plugins/iPlugin>
 
@@ -45,6 +46,7 @@ class Module : public Plugins::iPlugin
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPlugin)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/apps/PswGen/Storage/CMakeLists.txt b/src/apps/PswGen/Storage/CMakeLists.txt
index 2169469..e3ffd48 100644
--- a/src/apps/PswGen/Storage/CMakeLists.txt
+++ b/src/apps/PswGen/Storage/CMakeLists.txt
@@ -1,11 +1,6 @@
 # Name of the target
 set(TARGET PswStorage)
 
-# Qt modules
-set(QT_USE_QTSQL TRUE)
-set(QT_DONT_USE_QTGUI TRUE)
-include(${QT_USE_FILE})
-
 # Needed for exporting symbols
 add_definitions(-DPSWGEN_STORAGE_LIBRARY)
 
@@ -30,10 +25,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Sql)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/apps/PswGen/Storage/module.cpp b/src/apps/PswGen/Storage/module.cpp
index 12fda42..3c18b9a 100644
--- a/src/apps/PswGen/Storage/module.cpp
+++ b/src/apps/PswGen/Storage/module.cpp
@@ -18,7 +18,6 @@
  */
 
 #include "module.h"
-#include "version.h"
 
 #include <Common/Globals>
 #include <Common/iLogger>
@@ -29,7 +28,6 @@
 #include <QtSql/QtSql>
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::PswGen::Storage::Module)
 
 using namespace eVaf;
 using namespace eVaf::PswGen;
@@ -170,10 +168,10 @@ bool StorageImpl::save(QString const & name, QExplicitlySharedDataPointer<Storag
         }
 
         // Store also into the local hash
+        beginResetModel();
         mData.insert(name, data);
+        endResetModel();
 
-        // Reset the model
-        reset();
     }
 
     data->reset();
@@ -253,14 +251,14 @@ bool StorageImpl::loadData()
         return false;
     }
 
+    beginResetModel();
     while (q.next()) {
         QString name = q.value(0).toString();
         QExplicitlySharedDataPointer<Storage::Data> data(
                     new Storage::Data(name, q.value(1).toString(), q.value(2).toInt(), uint(q.value(3).toInt())));
         mData.insert(name, data);
     }
-
-    reset();
+    endResetModel();
 
     return true;
 }
diff --git a/src/apps/PswGen/Storage/module.h b/src/apps/PswGen/Storage/module.h
index 7f53b26..49c7e6a 100644
--- a/src/apps/PswGen/Storage/module.h
+++ b/src/apps/PswGen/Storage/module.h
@@ -21,6 +21,7 @@
 #  define __PSWGEN_STORAGE_MODULE_H
 
 #include "istorage.h"
+#include "version.h"
 
 #include <Plugins/iPlugin>
 
@@ -49,6 +50,7 @@ class Module : public Plugins::iPlugin
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPlugin)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/apps/ScosTime/CMakeLists.txt b/src/apps/ScosTime/CMakeLists.txt
index c56fb72..e32c9ef 100644
--- a/src/apps/ScosTime/CMakeLists.txt
+++ b/src/apps/ScosTime/CMakeLists.txt
@@ -1,9 +1,6 @@
 # Name of the target
 set(TARGET ScosTime)
 
-# Qt modules
-include(${QT_USE_FILE})
-
 # Include files
 include_directories(${eVaf_INCLUDE})
 
@@ -30,12 +27,14 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_add_resources(RCC_SRCS ${RCCS})
+qt5_add_resources(RCC_SRCS ${RCCS})
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS} ${RCC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Widgets)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/apps/ScosTime/gui.cpp b/src/apps/ScosTime/gui.cpp
index 1ea9ba1..1a978af 100644
--- a/src/apps/ScosTime/gui.cpp
+++ b/src/apps/ScosTime/gui.cpp
@@ -18,7 +18,6 @@
  */
 
 #include "gui.h"
-#include "version.h"
 
 #include <Common/Globals>
 #include <Common/iLogger>
@@ -26,11 +25,10 @@
 #include <SdiWindow/iSdiWindow>
 #include <Gui/Panel>
 
-#include <QtGui>
+#include <QtWidgets>
 
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::ScosTime::Module)
 
 
 //-------------------------------------------------------------------
diff --git a/src/apps/ScosTime/gui.h b/src/apps/ScosTime/gui.h
index fe6b5e3..581760b 100644
--- a/src/apps/ScosTime/gui.h
+++ b/src/apps/ScosTime/gui.h
@@ -20,6 +20,8 @@
 #ifndef __SCOSTIME_GUI_H
 #  define __SCOSTIME_GUI_H
 
+#include "version.h"
+
 #include <Plugins/iPlugin>
 
 #include <QObject>
@@ -41,6 +43,7 @@ class Module : public Plugins::iPlugin
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPlugin)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/libs/CMakeLists.txt b/src/libs/CMakeLists.txt
index eabd2bc..458a3d0 100644
--- a/src/libs/CMakeLists.txt
+++ b/src/libs/CMakeLists.txt
@@ -1,5 +1,5 @@
 add_subdirectory(Plugins)
 add_subdirectory(Common)
-if(QT_QTGUI_FOUND)
+if(Qt5Widgets_FOUND)
   add_subdirectory(Gui)
-endif(QT_QTGUI_FOUND)
+endif(Qt5Widgets_FOUND)
diff --git a/src/libs/Common/CMakeLists.txt b/src/libs/Common/CMakeLists.txt
index 83affd4..ce5f10c 100644
--- a/src/libs/Common/CMakeLists.txt
+++ b/src/libs/Common/CMakeLists.txt
@@ -1,10 +1,6 @@
 # Name of the target
 set(TARGET CommonLib)
 
-# Qt modules
-set(QT_DONT_USE_QTGUI TRUE)
-include(${QT_USE_FILE})
-
 # Needed for exporting/importing symbols
 add_definitions(-DCOMMON_LIBRARY)
 
@@ -49,10 +45,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/libs/Common/config.cpp b/src/libs/Common/config.cpp
index c4f0997..5303bb8 100644
--- a/src/libs/Common/config.cpp
+++ b/src/libs/Common/config.cpp
@@ -33,7 +33,7 @@ using namespace eVaf::Common;
 iConfig * iConfig::instance()
 {
     static Internal::Config singleton;
-    return singleton.interface();
+    return singleton._interface();
 }
 
 
@@ -55,7 +55,7 @@ Config::~Config()
     done();
 }
 
-iConfig * Config::interface() const
+iConfig * Config::_interface() const
 {
     return evafQueryInterface<iConfig>("iConfig");
 }
diff --git a/src/libs/Common/config.h b/src/libs/Common/config.h
index 3c19aaf..49f2c8e 100644
--- a/src/libs/Common/config.h
+++ b/src/libs/Common/config.h
@@ -65,7 +65,7 @@ public:
     /**
      * Returns the current implementation of the iConfig interface
      */
-    iConfig * interface() const;
+    iConfig * _interface() const;
 
     /**
      * Initializes the iConfig interface implementation.
diff --git a/src/libs/Common/eventqueue.cpp b/src/libs/Common/eventqueue.cpp
index 795224c..647d892 100644
--- a/src/libs/Common/eventqueue.cpp
+++ b/src/libs/Common/eventqueue.cpp
@@ -62,26 +62,20 @@ bool EventQueue::event(QEvent * e)
         uint id = event->id();
 
         // Verify that this event is registered
-        QHash<uint, QString>::const_iterator eventsIt = mEvents.constFind(id);
+        Events::const_iterator eventsIt = mEvents.constFind(id);
         if (eventsIt == mEvents.constEnd()) {
             return true; // We don't know it, but it is an eVaf event and we should handle it
         }
 
         // Send the event to all the subscribers
-        QHash<uint, QVector<QWeakPointer<QObject> > >::const_iterator subscribersIt = mSubscribers.constFind(id);
+        Subscribers::const_iterator subscribersIt = mSubscribers.constFind(id);
         if (subscribersIt != mSubscribers.constEnd()) {
-            QVector<QWeakPointer<QObject> > subscribers = *subscribersIt;
-            int sz = subscribers.size();
+            QVector<QObject *> subscribers = *subscribersIt;
+            int const sz = subscribers.size();
             for (int i = 0; i < sz; ++i) {
 
-                // Get the subscriber object and make sure that it is still alive
-                QWeakPointer<QObject> obj = subscribers.at(i);
-                if (obj.isNull()) {
-                    continue;
-                }
-
                 // Notify the subscriber
-                bool rval = QCoreApplication::sendEvent(obj.data(), e);
+                bool const rval = QCoreApplication::sendEvent(subscribers.at(i), e);
 
                 if (rval) {
                     // The event was consumed and should be sent to any other subscribers
@@ -133,7 +127,9 @@ uint EventQueue::subscribeEvent(uint id, QObject * obj)
     if (mSubscribers[id].indexOf(obj) != -1)
         return id;
 
+    // Add to the list of subscribers and connect to the destroyed() signal
     mSubscribers[id].append(obj);
+    connect(obj, SIGNAL(destroyed(QObject *)), this, SLOT(subscriberDestroyed(QObject *)));
 
     return id;
 }
@@ -148,13 +144,16 @@ void EventQueue::unsubscribeEvent(uint id, QObject * obj)
         return;
 
     // Remove from the list of subscribers
-    QVector<QWeakPointer<QObject> >::iterator it = mSubscribers[id].begin();
-    QVector<QWeakPointer<QObject> >::iterator e = mSubscribers[id].end();
+    QVector<QObject *>::iterator it = mSubscribers[id].begin();
+    QVector<QObject *>::const_iterator e = mSubscribers[id].end();
     while (it != e) {
-        if (!it->isNull() && it->data() == obj)
+        if (*it == obj) {
             it = mSubscribers[id].erase(it);
-        else
+            disconnect(*it, SIGNAL(destroyed(QObject *)), this, SLOT(subscriberDestroyed(QObject*)));
+        }
+        else {
             ++it;
+        }
     }
 }
 
@@ -162,3 +161,16 @@ void EventQueue::broadcastEvent(Event * event)
 {
     QCoreApplication::postEvent(this, event);
 }
+
+void EventQueue::subscriberDestroyed(QObject * obj)
+{
+    // Remove the subscriber from all the subscriber lists
+    Subscribers::iterator it = mSubscribers.begin();
+    Subscribers::const_iterator e = mSubscribers.end();
+    for (; it != e; ++it) {
+        int const idx = it->indexOf(obj);
+        if (idx != -1) {
+            it->remove(idx);
+        }
+    }
+}
diff --git a/src/libs/Common/eventqueue.h b/src/libs/Common/eventqueue.h
index b029376..a4b834b 100644
--- a/src/libs/Common/eventqueue.h
+++ b/src/libs/Common/eventqueue.h
@@ -26,7 +26,6 @@
 #include <QString>
 #include <QHash>
 #include <QVector>
-#include <QWeakPointer>
 
 
 namespace eVaf {
@@ -72,10 +71,19 @@ private: // Members
     uint mNextEventId;
 
     /// List of registered events
-    QHash<uint, QString> mEvents;
+    typedef QHash<uint, QString> Events;
+    Events mEvents;
 
     /// List of subscribers
-    QHash<uint, QVector<QWeakPointer<QObject> > > mSubscribers;
+    typedef QHash<uint, QVector<QObject *> > Subscribers;
+    Subscribers mSubscribers;
+
+
+private slots:
+
+    /// One of the subscribers is destroyed
+    /// We need to remove it from the list of subscribers.
+    void subscriberDestroyed(QObject * obj = 0);
 
 };
 
diff --git a/src/libs/Common/prop.cpp b/src/libs/Common/prop.cpp
index 86d3b1e..f6cfec6 100644
--- a/src/libs/Common/prop.cpp
+++ b/src/libs/Common/prop.cpp
@@ -34,7 +34,7 @@ using namespace eVaf::Common;
 iProp * iProp::instance()
 {
     static Internal::Prop singleton;
-    return singleton.interface();
+    return singleton._interface();
 }
 
 
@@ -57,7 +57,7 @@ Prop::~Prop()
     done();
 }
 
-iProp * Prop::interface() const
+iProp * Prop::_interface() const
 {
     return evafQueryInterface<iProp>("iProp");
 }
diff --git a/src/libs/Common/prop.h b/src/libs/Common/prop.h
index 4e44e27..1574f25 100644
--- a/src/libs/Common/prop.h
+++ b/src/libs/Common/prop.h
@@ -51,7 +51,7 @@ public:
     /**
      * Returns the current implementation of the iProp interface
      */
-    iProp * interface() const;
+    iProp * _interface() const;
 
     /**
      * Initializes the iProp interface implementation
diff --git a/src/libs/Common/registry.cpp b/src/libs/Common/registry.cpp
index 661d2c7..6c8cc62 100644
--- a/src/libs/Common/registry.cpp
+++ b/src/libs/Common/registry.cpp
@@ -54,13 +54,32 @@ Registry::~Registry()
 
 bool Registry::registerInterface(QString const & name, QObject * obj)
 {
-    mInterfaces.insert(name, QWeakPointer<QObject>(obj));
+    // Add the interface to the list of registered interfaces and connect to
+    // the destroyed() signal.
+    mInterfaces.insert(name, obj);
+    connect(obj, SIGNAL(destroyed()), this, SLOT(interfaceDestroyed(QObject *)));
 
     return true;
 }
 
 QObject * Registry::queryInterface(QString const & name) const
 {
-    QHash<QString, QWeakPointer<QObject> >::const_iterator it = mInterfaces.constFind(name);
-    return it != mInterfaces.constEnd() ? (*it).data() : 0;
+    Interfaces::const_iterator it = mInterfaces.constFind(name);
+    return it != mInterfaces.constEnd() ? *it : 0;
+}
+
+void Registry::interfaceDestroyed(QObject * obj)
+{
+    // Interface object destroyed. Remove it from the list of registered
+    // interfaces.
+    Interfaces::iterator it = mInterfaces.begin();
+    Interfaces::const_iterator e = mInterfaces.end();
+    while (it != e) {
+        if (*it == obj) {
+            it = mInterfaces.erase(it);
+        }
+        else {
+            ++it;
+        }
+    }
 }
diff --git a/src/libs/Common/registry.h b/src/libs/Common/registry.h
index 9c05c50..e8bf68b 100644
--- a/src/libs/Common/registry.h
+++ b/src/libs/Common/registry.h
@@ -24,7 +24,6 @@
 
 #include <QObject>
 #include <QString>
-#include <QWeakPointer>
 #include <QHash>
 
 namespace eVaf {
@@ -59,7 +58,15 @@ public:
 private:
 
     /// All the registered interfaces
-    QHash<QString, QWeakPointer<QObject> > mInterfaces;
+    typedef QHash<QString, QObject *> Interfaces;
+    Interfaces mInterfaces;
+
+
+private slots:
+
+    /// Interface object destroyed
+    /// We need to remove the interface from the list of registered interfaces
+    void interfaceDestroyed(QObject * obj = 0);
 
 };
 
diff --git a/src/libs/Gui/CMakeLists.txt b/src/libs/Gui/CMakeLists.txt
index 8821dc1..eea9014 100644
--- a/src/libs/Gui/CMakeLists.txt
+++ b/src/libs/Gui/CMakeLists.txt
@@ -1,9 +1,6 @@
 # Name of the target
 set(TARGET GuiLib)
 
-# Qt modules
-include(${QT_USE_FILE})
-
 # Needed for exporting/importing symbols
 add_definitions(-DGUI_LIBRARY)
 
@@ -28,10 +25,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
+qt5_use_modules(${TARGET} Core Widgets)
+
 target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/libs/Plugins/CMakeLists.txt b/src/libs/Plugins/CMakeLists.txt
index edcfae6..c0c958e 100644
--- a/src/libs/Plugins/CMakeLists.txt
+++ b/src/libs/Plugins/CMakeLists.txt
@@ -1,11 +1,6 @@
 # Name of the target
 set(TARGET PluginsLib)
 
-# Qt modules
-set(QT_DONT_USE_QTGUI TRUE)
-set(QT_USE_QTXML TRUE)
-include(${QT_USE_FILE})
-
 # Needed for exporting/importing symbols
 add_definitions(-DPLUGINS_LIBRARY)
 
@@ -33,10 +28,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Xml)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/libs/Plugins/pluginmanager.cpp b/src/libs/Plugins/pluginmanager.cpp
index dac188f..5d08dcb 100644
--- a/src/libs/Plugins/pluginmanager.cpp
+++ b/src/libs/Plugins/pluginmanager.cpp
@@ -291,14 +291,8 @@ bool PluginManagerPrivate::loadPlugins()
         } // End element?
     }
 
-    // Load Qt plugins
-    int i;
-    for (i = 0; i < qtPlugins.size(); ++i) {
-        loadQtPlugin(qtPlugins.at(i));
-    }
-
     // Load eVaf plugins
-    i = 0;
+    int i = 0;
     while (i < mPlugins.size()) {
         if (!mPlugins.at(i)->load()) {
             EVAF_ERROR("Failed to load module '%s'", qPrintable(mPlugins.at(i)->name()));
@@ -348,57 +342,6 @@ Module * PluginManagerPrivate::moduleByName(QString const & name) const
     return 0;
 }
 
-bool PluginManagerPrivate::loadQtPlugin(QString const & name) const
-{
-    // Get the Qt plugin file name with the full path
-    QString fileName;
-
-#ifdef Q_OS_LINUX
-    fileName = QString("%1libq%2.so").arg(Common::iApp::instance()->qtPluginsDir()).arg(name);
-#  ifndef QT_NO_DEBUG
-    QString t = QString("%1libq%2.so.debug").arg(Common::iApp::instance()->qtPluginsDir()).arg(name);
-    if (QFile::exists(t))
-        fileName = t;
-#  endif
-#endif
-
-#ifdef Q_OS_WIN32
-    fileName = QString("%1q%2%3").arg(Common::iApp::instance()->qtPluginsDir()).arg(name).arg("4.dll");
-#  ifndef QT_NO_DEBUG
-    QString t = QString("%1q%2%3").arg(Common::iApp::instance()->qtPluginsDir()).arg(name).arg("d4.dll");
-    if (!QFile::exists(t))
-        fileName = t;
-#  endif
-#endif
-
-#ifdef Q_OS_CYGWIN
-    fileName = QString("%1cygq%2.dll").arg(Common::iApp::instance()->qtPluginsDir()).arg(name);
-#  ifndef QT_NO_DEBUG
-    QString t = QString("%1libq%2.dll.debug").arg(Common::iApp::instance()->qtPluginsDir()).arg(name);
-    if (QFile::exists(t))
-        fileName = t;
-#  endif
-#endif
-
-    if (fileName.isEmpty()) {
-        EVAF_ERROR("Don\'t know how to load Qt plugin '%s'", qPrintable(name));
-        return false;
-    }
-
-    EVAF_INFO("Loading Qt plugin '%s'", qPrintable(fileName));
-
-    QLibrary lib(fileName);
-    void * fn = lib.resolve("qt_plugin_instance");
-    if (fn) {
-        qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunction(fn));
-        return true;
-    }
-    else {
-        EVAF_ERROR("Failed to load Qt plugin '%s' : %s", qPrintable(fileName), qPrintable(lib.errorString()));
-        return false;
-    }
-}
-
 
 //-------------------------------------------------------------------
 
diff --git a/src/libs/Plugins/pluginmanager_p.h b/src/libs/Plugins/pluginmanager_p.h
index 22a0de1..9033d15 100644
--- a/src/libs/Plugins/pluginmanager_p.h
+++ b/src/libs/Plugins/pluginmanager_p.h
@@ -91,13 +91,6 @@ private: // Methods
      */
     Module * moduleByName(QString const & name) const;
 
-    /**
-     * Loads the Qt plugin
-     * @param Name of the Qt plugin
-     * @return True; false if failed
-     */
-    bool loadQtPlugin(QString const & name) const;
-
 };
 
 /**
diff --git a/src/libs/version_rc.h b/src/libs/version_rc.h
index ed8a20f..6920cf1 100644
--- a/src/libs/version_rc.h
+++ b/src/libs/version_rc.h
@@ -20,6 +20,8 @@
 #ifndef __VERSION_RC_H
 #define __VERSION_RC_H
 
+#include <QtCore/qglobal.h>
+
 /**
  * Product's version number in the format major,minor,release
  */
diff --git a/src/main/CLI/CMakeLists.txt b/src/main/CLI/CMakeLists.txt
index a3983a6..d86dcc5 100644
--- a/src/main/CLI/CMakeLists.txt
+++ b/src/main/CLI/CMakeLists.txt
@@ -1,10 +1,6 @@
 # Name of the target
 set(TARGET eVafCLI)
 
-# Qt modules
-set(QT_DONT_USE_QTGUI TRUE)
-include(${QT_USE_FILE})
-
 # Include files
 include_directories(${eVaf_INCLUDE})
 
@@ -27,10 +23,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc cli.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_executable(${TARGET} ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/main/CLI/main.cpp b/src/main/CLI/main.cpp
index 0c3cbb6..691db7a 100644
--- a/src/main/CLI/main.cpp
+++ b/src/main/CLI/main.cpp
@@ -49,7 +49,7 @@ namespace Internal {
  *
  * This function outputs messages to the console and to the log file.
  */
-static void messageOutput(QtMsgType type, char const * const msg)
+static void messageOutput(QtMsgType type, QMessageLogContext const &, QString const & msg)
 {
     static bool inHandler = false;
 
@@ -238,7 +238,7 @@ int main(int argc, char ** argv)
 
     // Install our onw message handlers
     Common::iLogger::instance()->installFatalMsgHandler(Internal::fatalMsgHandler);
-    qInstallMsgHandler(Internal::messageOutput);
+    qInstallMessageHandler(Internal::messageOutput);
 
     // Process command-line arguments
     if (!Application::processCommandLine(argc, argv))
diff --git a/src/main/CMakeLists.txt b/src/main/CMakeLists.txt
index e5169f7..29d32a7 100644
--- a/src/main/CMakeLists.txt
+++ b/src/main/CMakeLists.txt
@@ -1,4 +1,4 @@
-if(QT_QTGUI_FOUND)
+if(Qt5Widgets_FOUND)
   add_subdirectory(GUI)
-endif(QT_QTGUI_FOUND)
+endif(Qt5Widgets_FOUND)
 add_subdirectory(CLI)
diff --git a/src/main/GUI/CMakeLists.txt b/src/main/GUI/CMakeLists.txt
index 367e2f5..cfb011c 100644
--- a/src/main/GUI/CMakeLists.txt
+++ b/src/main/GUI/CMakeLists.txt
@@ -1,10 +1,6 @@
 # Name of the target
 set(TARGET eVafGUI)
 
-# Qt modules
-set(QT_USE_QTMAIN TRUE)
-include(${QT_USE_FILE})
-
 # Include files
 include_directories(${eVaf_INCLUDE})
 
@@ -33,21 +29,23 @@ set(MOC_HDRS
 )
 
 # Resources
-#set(RCCS
-#    gui.qrc
-#)
+set(RCCS
+    gui.qrc
+)
 
 # Version info resource file for Windows builds
 if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc gui.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_add_resources(RCC_SRCS ${RCCS})
+qt5_add_resources(RCC_SRCS ${RCCS})
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_executable(${TARGET} WIN32 ${SRCS} ${MOC_SRCS} ${RCC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Widgets)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/main/GUI/fatalerr.cpp b/src/main/GUI/fatalerr.cpp
index 3c37b0f..24e6a59 100644
--- a/src/main/GUI/fatalerr.cpp
+++ b/src/main/GUI/fatalerr.cpp
@@ -19,7 +19,7 @@
 
 #include "fatalerr.h"
 
-#include <QtGui>
+#include <QtWidgets>
 
 using namespace eVaf::GUI::Internal;
 
diff --git a/src/main/GUI/main.cpp b/src/main/GUI/main.cpp
index f0e765f..313d210 100644
--- a/src/main/GUI/main.cpp
+++ b/src/main/GUI/main.cpp
@@ -82,7 +82,7 @@ static eVaf::Common::iLogger::Severity ConsoleSeverityLevel = eVaf::Common::iLog
  *
  * This function outputs messages to the console and to the log file.
  */
-static void messageOutput(QtMsgType type, char const * const msg)
+static void messageOutput(QtMsgType type, QMessageLogContext const &, QString const & msg)
 {
     static bool inHandler = false;
 
@@ -357,7 +357,7 @@ int main(int argc, char ** argv)
 
     // Install our own message handlers
     Common::iLogger::instance()->installFatalMsgHandler(Internal::fatalMsgHandler);
-    qInstallMsgHandler(Internal::messageOutput);
+    qInstallMessageHandler(Internal::messageOutput);
 
     // Process command-line arguments
     if (!Application::processCommandLine(argc, argv))
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
index bffa796..b4bf96d 100644
--- a/src/plugins/CMakeLists.txt
+++ b/src/plugins/CMakeLists.txt
@@ -1,5 +1,5 @@
-if(QT_QTGUI_FOUND)
+if(Qt5Widgets_FOUND)
   add_subdirectory(SdiWindow)
   add_subdirectory(LogView)
   add_subdirectory(Test)
-endif(QT_QTGUI_FOUND)
+endif(Qt5Widgets_FOUND)
diff --git a/src/plugins/LogView/CMakeLists.txt b/src/plugins/LogView/CMakeLists.txt
index ac0d07f..1d4b839 100644
--- a/src/plugins/LogView/CMakeLists.txt
+++ b/src/plugins/LogView/CMakeLists.txt
@@ -1,9 +1,6 @@
 # Name of the target
 set(TARGET LogView)
 
-# Qt modules
-include(${QT_USE_FILE})
-
 # Needed for exporting/importing symbols
 add_definitions(-DLOGVIEW_LIBRARY)
 
@@ -30,10 +27,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Widgets)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/plugins/LogView/factory.cpp b/src/plugins/LogView/factory.cpp
index c4d5d09..52a7773 100644
--- a/src/plugins/LogView/factory.cpp
+++ b/src/plugins/LogView/factory.cpp
@@ -19,7 +19,6 @@
 
 #include "factory.h"
 #include "logview.h"
-#include "version.h"
 
 #include <Common/iLogger>
 
@@ -28,7 +27,6 @@
 using namespace eVaf::LogView;
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, Factory)
 
 
 //-------------------------------------------------------------------
diff --git a/src/plugins/LogView/factory.h b/src/plugins/LogView/factory.h
index 4d36f91..bdf3962 100644
--- a/src/plugins/LogView/factory.h
+++ b/src/plugins/LogView/factory.h
@@ -20,6 +20,8 @@
 #ifndef __LOGVIEW_FACTORY_H
 #  define __LOGVIEW_FACTORY_H
 
+#include "version.h"
+
 #include <Plugins/iPluginFactory>
 
 namespace eVaf {
@@ -36,6 +38,7 @@ class Factory : public Plugins::iPluginFactory
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPluginFactory)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/plugins/LogView/logview.cpp b/src/plugins/LogView/logview.cpp
index 1f75c58..75e973e 100644
--- a/src/plugins/LogView/logview.cpp
+++ b/src/plugins/LogView/logview.cpp
@@ -26,7 +26,7 @@
 #include <Common/iRegistry>
 #include <SdiWindow/iSdiWindow>
 
-#include <QtGui>
+#include <QtWidgets>
 #include <QXmlStreamReader>
 
 
diff --git a/src/plugins/SdiWindow/CMakeLists.txt b/src/plugins/SdiWindow/CMakeLists.txt
index cd0a8c0..75f9ce7 100644
--- a/src/plugins/SdiWindow/CMakeLists.txt
+++ b/src/plugins/SdiWindow/CMakeLists.txt
@@ -1,9 +1,6 @@
 # Name of the target
 set(TARGET SdiWindow)
 
-# Qt modules
-include(${QT_USE_FILE})
-
 # Needed for exporting/importing symbols
 add_definitions(-DSDIWINDOW_LIBRARY)
 
@@ -30,10 +27,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Widgets Xml)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/plugins/SdiWindow/factory.cpp b/src/plugins/SdiWindow/factory.cpp
index 5ce4d1a..a8a9a8b 100644
--- a/src/plugins/SdiWindow/factory.cpp
+++ b/src/plugins/SdiWindow/factory.cpp
@@ -19,7 +19,6 @@
 
 #include "factory.h"
 #include "sdiwindow.h"
-#include "version.h"
 
 #include <Common/iLogger>
 
@@ -28,7 +27,6 @@
 using namespace eVaf::SdiWindow;
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, Factory)
 
 
 //-------------------------------------------------------------------
diff --git a/src/plugins/SdiWindow/factory.h b/src/plugins/SdiWindow/factory.h
index 5010928..78b2f72 100644
--- a/src/plugins/SdiWindow/factory.h
+++ b/src/plugins/SdiWindow/factory.h
@@ -20,6 +20,7 @@
 #ifndef __SDIWINDOW_FACTORY_H
 #  define __SDIWINDOW_FACTORY_H
 
+#include "version.h"
 #include <Plugins/iPluginFactory>
 
 namespace eVaf {
@@ -46,6 +47,7 @@ class Factory : public Plugins::iPluginFactory
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPluginFactory)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public:
 
diff --git a/src/plugins/SdiWindow/sdiwindow.cpp b/src/plugins/SdiWindow/sdiwindow.cpp
index c0e3587..eb1a449 100644
--- a/src/plugins/SdiWindow/sdiwindow.cpp
+++ b/src/plugins/SdiWindow/sdiwindow.cpp
@@ -25,7 +25,7 @@
 #include <Common/iApp>
 #include <Common/iProp>
 
-#include <QtGui>
+#include <QtWidgets>
 #include <QXmlStreamReader>
 
 namespace eVaf {
@@ -53,7 +53,6 @@ SdiWindow::iSdiWindow * SdiWindow::iSdiWindow::instance()
 SdiWindow::Internal::MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags)
     : QWidget(parent, flags)
     , mReady(false)
-    , mTimerId(0)
 {
     setObjectName(QString("%1-%2").arg(VER_MODULE_NAME_STR).arg(__FUNCTION__));
 
@@ -103,9 +102,6 @@ bool SdiWindow::Internal::MainWindow::init(QString const & args)
 
     setWindowTitle(Common::iApp::instance()->name());
 
-    // Start the garbage collector timer
-    mTimerId = startTimer(60 * 1000);
-
     show();
 
     mReady = true;
@@ -121,21 +117,15 @@ void SdiWindow::Internal::MainWindow::done()
 
     close();
 
-    if (mTimerId) {
-        killTimer(mTimerId);
-        mTimerId = 0;
-    }
-
     // Delete all the panels
     for (int i = mPanels.size() - 1; i >= 0; --i) {
-        QWeakPointer<Gui::Panel> p = mPanels.at(i);
-        if (p)
-            delete p.data();
+        disconnect(mPanels.at(i), SIGNAL(destroyed(QObject *)), this, SLOT(panelDestroyed(QObject *)));
+        delete mPanels.at(i);
     }
     mPanels.clear();
     mMinimizedPanels.clear();
     mPanelNames.clear();
-    mMainPanel.clear();
+    mMainPanel = 0;
     mMainPanelName.clear();
 
     EVAF_INFO("%s finalized", qPrintable(objectName()));
@@ -143,6 +133,7 @@ void SdiWindow::Internal::MainWindow::done()
 
 void SdiWindow::Internal::MainWindow::addPanel(QString const & name, Gui::Panel * panel)
 {
+    connect(panel, SIGNAL(destroyed(QObject *)), this, SLOT(panelDestroyed(QObject*)));
     mPanels.append(panel);
     mPanelNames.insert(name, panel);
 
@@ -165,9 +156,9 @@ void SdiWindow::Internal::MainWindow::addPanel(QString const & name, Gui::Panel
 
 Gui::Panel * SdiWindow::Internal::MainWindow::panel(QString const & name) const
 {
-    QHash<QString, QWeakPointer<Gui::Panel> >::const_iterator it = mPanelNames.constFind(name);
+    QHash<QString, Gui::Panel *>::const_iterator it = mPanelNames.constFind(name);
     if (it != mPanelNames.constEnd())
-        return it.value().data();
+        return it.value();
     return 0;
 }
 
@@ -246,12 +237,10 @@ void SdiWindow::Internal::MainWindow::setWindowSize()
 void SdiWindow::Internal::MainWindow::closeEvent(QCloseEvent * e)
 {
     // Try to close all the managed panels; ignore the event if one of the managed panels refuses to close
-    foreach (QWeakPointer<Gui::Panel> p, mPanels) {
-        if (p) {
-            if (!p.data()->close()) {
-                e->ignore();
-                return;
-            }
+    foreach (Gui::Panel * p, mPanels) {
+        if (!p->close()) {
+            e->ignore();
+            return;
         }
     }
 
@@ -266,9 +255,9 @@ void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e)
         if (windowState() == Qt::WindowNoState && wse->oldState() == Qt::WindowMinimized) {
 
             // Restore all the managed panels that were previously minimized
-            foreach (QWeakPointer<Gui::Panel> p, mMinimizedPanels) {
-                if (p && p.data()->isVisible())
-                    p.data()->showNormal();
+            foreach (Gui::Panel * p, mMinimizedPanels) {
+                if (p->isVisible())
+                    p->showNormal();
             }
             mMinimizedPanels.clear();
         }
@@ -277,13 +266,10 @@ void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e)
 
             // Minimize all the managed panels that are not minimized yet
             mMinimizedPanels.clear();
-            foreach (QWeakPointer<Gui::Panel> p, mPanels) {
-                if (!p)
-                    continue;
-
-                if (p.data()->windowState() != Qt::WindowMinimized && p.data()->isVisible()) {
+            foreach (Gui::Panel * p, mPanels) {
+                if (p->windowState() != Qt::WindowMinimized && p->isVisible()) {
                     mMinimizedPanels.append(p);
-                    p.data()->showMinimized();
+                    p->showMinimized();
                 }
             }
         }
@@ -291,36 +277,37 @@ void SdiWindow::Internal::MainWindow::changeEvent(QEvent * e)
     QWidget::changeEvent(e);
 }
 
-void SdiWindow::Internal::MainWindow::timerEvent(QTimerEvent * e)
+void SdiWindow::Internal::MainWindow::panelDestroyed(QObject * obj)
 {
-    if (e->timerId() == mTimerId) {
-
-        // Remove panels that are deleted
-        {
-            QList<QWeakPointer<Gui::Panel> >::iterator it = mPanels.begin();
-            while (it != mPanels.end()) {
-                QWeakPointer<Gui::Panel> p = *it;
-                if (!p)
-                    it = mPanels.erase(it);
-                else
-                    ++it;
+    // Remove panels that are deleted
+    {
+        QList<Gui::Panel *>::iterator it = mPanels.begin();
+        while (it != mPanels.end()) {
+            if (*it == obj) {
+                it = mPanels.erase(it);
+            }
+            else {
+                ++it;
             }
         }
+    }
 
-        // Do the same with panel names
-        {
-            QHash<QString, QWeakPointer<Gui::Panel> >::iterator it = mPanelNames.begin();
-            while (it != mPanelNames.end()) {
-                QWeakPointer<Gui::Panel> p = it.value();
-                if (!p)
-                    it = mPanelNames.erase(it);
-                else
-                    ++it;
+    // Do the same with panel names
+    {
+        QHash<QString, Gui::Panel *>::iterator it = mPanelNames.begin();
+        while (it != mPanelNames.end()) {
+            if (it.value() == obj) {
+                it = mPanelNames.erase(it);
+            }
+            else {
+                ++it;
             }
         }
     }
-    else
-        QWidget::timerEvent(e);
+
+    if (mMainPanel == obj) {
+        mMainPanel = 0;
+    }
 }
 
 
diff --git a/src/plugins/SdiWindow/sdiwindow.h b/src/plugins/SdiWindow/sdiwindow.h
index 757ed28..4c46eea 100644
--- a/src/plugins/SdiWindow/sdiwindow.h
+++ b/src/plugins/SdiWindow/sdiwindow.h
@@ -31,7 +31,6 @@
 #include <QList>
 #include <QVector>
 #include <QHash>
-#include <QWeakPointer>
 
 class QVBoxLayout;
 
@@ -72,9 +71,6 @@ public:
 
 protected: // Methods
 
-    /// Garbage collector timer
-    virtual void timerEvent(QTimerEvent * e);
-
 
 private: // Methods
 
@@ -97,19 +93,16 @@ private: // Members
     QString mMainPanelName;
 
     /// List of GUI::Panel objects added to the manager
-    QList<QWeakPointer<Gui::Panel> > mPanels;
+    QList<Gui::Panel *> mPanels;
 
     /// List of minimized GUI::Panel objects
-    QVector<QWeakPointer<Gui::Panel> > mMinimizedPanels;
+    QVector<Gui::Panel *> mMinimizedPanels;
 
     /// Hash with panel names
-    QHash<QString, QWeakPointer<Gui::Panel> > mPanelNames;
+    QHash<QString, Gui::Panel *> mPanelNames;
 
     /// Current main panel added to this window
-    QWeakPointer<Gui::Panel> mMainPanel;
-
-    /// Garbage collector timer ID
-    int mTimerId;
+    Gui::Panel * mMainPanel;
 
 
 private: // Methods
@@ -117,6 +110,13 @@ private: // Methods
     /// Gets the main panel name from module attributes
     QString getMainPanelName(QString const & args) const;
 
+
+private slots:
+
+    /// Panel destroyed signal. We need to remove the panel from all the
+    /// lists.
+    void panelDestroyed(QObject * obj = 0);
+
 };
 
 /**
diff --git a/src/plugins/Test/CMakeLists.txt b/src/plugins/Test/CMakeLists.txt
index bbf03ba..f4aa339 100644
--- a/src/plugins/Test/CMakeLists.txt
+++ b/src/plugins/Test/CMakeLists.txt
@@ -1,9 +1,6 @@
 # Name of the target
 set(TARGET Test)
 
-# Qt modules
-include(${QT_USE_FILE})
-
 # Include files
 include_directories(${eVaf_INCLUDE})
 
@@ -27,10 +24,12 @@ if(WIN32 AND NOT MINGW)
     set(SRCS ${SRCS} version.rc)
 endif(WIN32 AND NOT MINGW)
 
-qt4_wrap_cpp(MOC_SRCS ${MOC_HDRS})
+qt5_wrap_cpp(MOC_SRCS ${MOC_HDRS})
 
 add_library(${TARGET} SHARED ${SRCS} ${MOC_SRCS})
 
-target_link_libraries(${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES})
+qt5_use_modules(${TARGET} Core Widgets)
+
+target_link_libraries(${TARGET} ${eVaf_LIBRARIES})
 
 install(TARGETS ${TARGET} DESTINATION bin)
diff --git a/src/plugins/Test/factory.cpp b/src/plugins/Test/factory.cpp
index feb433f..e3cba8b 100644
--- a/src/plugins/Test/factory.cpp
+++ b/src/plugins/Test/factory.cpp
@@ -19,7 +19,6 @@
 
 #include "factory.h"
 #include "test.h"
-#include "version.h"
 
 #include <Common/iLogger>
 
@@ -28,7 +27,6 @@
 using namespace eVaf::Test;
 
 VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, Factory)
 
 
 //-------------------------------------------------------------------
diff --git a/src/plugins/Test/factory.h b/src/plugins/Test/factory.h
index 089d869..fbb40c9 100644
--- a/src/plugins/Test/factory.h
+++ b/src/plugins/Test/factory.h
@@ -20,6 +20,8 @@
 #ifndef __TEST_FACTORY_H
 #define __TEST_FACTORY_H
 
+#include "version.h"
+
 #include <Plugins/iPluginFactory>
 
 namespace eVaf {
@@ -44,6 +46,7 @@ class Factory : public Plugins::iPluginFactory
 {
     Q_OBJECT
     Q_INTERFACES(eVaf::Plugins::iPluginFactory)
+    Q_PLUGIN_METADATA(IID VER_MODULE_NAME_STR)
 
 public: