瀏覽代碼

Fixed Qt4/5 MOC issues regarding QIconEngineV2.

Stefan Kislinskiy 10 年之前
父節點
當前提交
a1f5a9ee6c

+ 8 - 1
Libs/Widgets/CMakeLists.txt

@@ -98,6 +98,8 @@ set(KIT_SRCS
   ctkHistogram.h
   ctkIconEnginePlugin.cpp
   ctkIconEnginePlugin.h
+  ctkIconEnginePlugin_qt4.h
+  ctkIconEnginePlugin_qt5.h
   ctkLanguageComboBox.cpp
   ctkLanguageComboBox.h
   ctkLayoutFactory.cpp
@@ -250,7 +252,6 @@ set(KIT_MOC_SRCS
   ctkFlowLayout.h
   ctkFontButton.h
   ctkHistogram.h
-  ctkIconEnginePlugin.h
   ctkLanguageComboBox.h
   ctkLayoutFactory.h
   ctkLayoutManager.h
@@ -304,6 +305,12 @@ set(KIT_MOC_SRCS
   ctkWorkflowWidgetStep_p.h
   )
 
+if(CTK_QT_VERSION VERSION_GREATER "4")
+  list(APPEND KIT_MOC_SRCS ctkIconEnginePlugin_qt5.h)
+else()
+  list(APPEND KIT_MOC_SRCS ctkIconEnginePlugin_qt4.h)
+endif()
+
 # Headers that should run through moc without adding
 # the generated cpp file to the source list
 set(KIT_GENERATE_MOC_SRCS

+ 9 - 110
Libs/Widgets/ctkIconEnginePlugin.h

@@ -21,117 +21,16 @@
 #ifndef __ctkIconEnginePlugin_h
 #define __ctkIconEnginePlugin_h
 
-// Qt includes
-#if QT_VERSION >= 0x050000
-# include <QIconEngine>
-# include <QIconEnginePlugin>
+#include <QtGlobal>
+
+// The MOC is not able to parse "#if QT_VERSION >= 0x..." in Qt 5 and
+// "#if QT_VERSION >= QT_VERSION_CHECK(...)" in Qt4. As a workaround,
+// we check for the Qt version here (not parsed by MOC) and provide two
+// versions of the actual header file according to the used Qt version.
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+# include <ctkIconEnginePlugin_qt5.h>
 #else
-# include <QIconEngineV2>
-# include <QIconEnginePluginV2>
+# include <ctkIconEnginePlugin_qt4.h>
 #endif
 
-// CTK includes
-#include "ctkPimpl.h"
-#include "ctkPixmapIconEngine.h"
-#include "ctkWidgetsExport.h"
-
-class ctkIconEnginePluginPrivate;
-class ctkIconEnginePrivate;
-
-/// \ingroup Widgets
-/// ctkIconEnginePlugin must be loaded when starting the application.
-/// \code
-/// QApplication myApp;
-/// QCoreApplication::addLibraryPath("MyApp-build/plugins");
-/// \endcode
-/// where the plugin must be located in "MyApp-build/plugins/iconengines"
-/// don't forget to declare in the cpp file:
-///   Q_EXPORT_PLUGIN2(yourpluginName, ctkIconEnginePlugin)
-class CTK_WIDGETS_EXPORT ctkIconEnginePlugin
-// Can't use QT_VERSION_CHECK macro for Qt 4 moc parsing
-#if QT_VERSION >= 0x050000
-  : public QIconEnginePlugin
-#else
-  : public QIconEnginePluginV2
-#endif
-{
-  Q_OBJECT;
-public:
-  ctkIconEnginePlugin(QObject* parent = 0);
-  virtual ~ctkIconEnginePlugin();
-
-#if QT_VERSION >= 0x050000
-  virtual QIconEngine* create(const QString& filename=QString());
-#else
-  virtual QIconEngineV2* create(const QString& filename=QString());
-#endif
-  /// Support all the Qt image formats by default
-  virtual QStringList keys()const;
-
-  /// Directory list given to the created icon engines
-  /// Subdirectories where the icons should be searched, typically:
-  /// "Small", "Medium", "Large", "XLarge" or
-  /// "16x16", "32x32", "64x64", "128x128" or
-  /// "LowDef", "HighDef"
-  /// \sa ctkIconEnginePlugin::setSizeDirectories
-  void setSizeDirectories(const QStringList& sizeDirectories);
-  QStringList sizeDirectories()const;
-protected:
-  QScopedPointer<ctkIconEnginePluginPrivate> d_ptr;
-
-private:
-  Q_DECLARE_PRIVATE(ctkIconEnginePlugin);
-  Q_DISABLE_COPY(ctkIconEnginePlugin);
-};
-
-//------------------------------------------------------------------------------
-/// \ingroup Widgets
-/// ctkIconEngine is an icon engine that behaves like the default Qt icon engine
-/// QPixmapIconEngine(ctkPixmapIconEngine)), but can automatically support icons
-/// in multiple size. When adding a file to an icon, it will automatically check
-/// if the same file name exists in a different directory. This allows the
-/// application to contains icons in different size,e.g. :/Icons/Small/edit.png
-/// and :/Icons/Large/edit.png.
-/// Without ctkIconEngine, QIcon already support mutltiple files:
-/// \code
-///  QIcon editIcon;
-///  editIcon.addFile(":/Icons/Small/edit.png");
-///  editIcon.addFile(":/Icons/Large/edit.png");
-/// \endcode
-/// Using ctkIconEngine, adding a file to an icon will automatically search for
-/// any icon in a different directory:
-/// \code
-///  ctkIconEngine* autoIconEngine;
-///  autoIconEngine->setSizeDirectories(QStringList() << "Large" << "Small";
-///  QIcon editIcon(autoIconEngine);
-///  editIcon.addFile(":/Icons/Small/edit.png");
-/// \endcode
-/// where the large version of the icon is automatically added.
-/// It is mostly useful when using the designer, where only 1 icon file can
-/// be specified. It must be used with ctkIconEnginePlugin
-/// TODO: support more than just files in ressources.
-class CTK_WIDGETS_EXPORT ctkIconEngine: public ctkPixmapIconEngine
-{
-public:
-  typedef ctkPixmapIconEngine Superclass;
-  ctkIconEngine();
-  virtual ~ctkIconEngine();
-  virtual void addFile(const QString& fileName, const QSize& size,
-                       QIcon::Mode mode, QIcon::State state);
-  /// Subdirectories where the icons should be searched, typically:
-  /// "Small", "Medium", "Large", "XLarge" or
-  /// "16x16", "32x32", "64x64", "128x128" or
-  /// "LowDef", "HighDef"
-  void setSizeDirectories(const QStringList& sizeDirectories);
-  QStringList sizeDirectories()const;
-
-  virtual QString key()const;
-
-protected:
-  QScopedPointer<ctkIconEnginePrivate> d_ptr;
-
-private:
-  Q_DECLARE_PRIVATE(ctkIconEngine);
-  Q_DISABLE_COPY(ctkIconEngine);
-};
 #endif

+ 125 - 0
Libs/Widgets/ctkIconEnginePlugin_qt4.h

@@ -0,0 +1,125 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+#ifndef __ctkIconEnginePlugin_qt4_h
+#define __ctkIconEnginePlugin_qt4_h
+
+// Qt includes
+# include <QIconEngineV2>
+# include <QIconEnginePluginV2>
+
+// CTK includes
+#include "ctkPimpl.h"
+#include "ctkPixmapIconEngine.h"
+#include "ctkWidgetsExport.h"
+
+class ctkIconEnginePluginPrivate;
+class ctkIconEnginePrivate;
+
+/// \ingroup Widgets
+/// ctkIconEnginePlugin must be loaded when starting the application.
+/// \code
+/// QApplication myApp;
+/// QCoreApplication::addLibraryPath("MyApp-build/plugins");
+/// \endcode
+/// where the plugin must be located in "MyApp-build/plugins/iconengines"
+/// don't forget to declare in the cpp file:
+///   Q_EXPORT_PLUGIN2(yourpluginName, ctkIconEnginePlugin)
+class CTK_WIDGETS_EXPORT ctkIconEnginePlugin
+  : public QIconEnginePluginV2
+{
+  Q_OBJECT;
+public:
+  ctkIconEnginePlugin(QObject* parent = 0);
+  virtual ~ctkIconEnginePlugin();
+
+  virtual QIconEngineV2* create(const QString& filename=QString());
+
+  /// Support all the Qt image formats by default
+  virtual QStringList keys()const;
+
+  /// Directory list given to the created icon engines
+  /// Subdirectories where the icons should be searched, typically:
+  /// "Small", "Medium", "Large", "XLarge" or
+  /// "16x16", "32x32", "64x64", "128x128" or
+  /// "LowDef", "HighDef"
+  /// \sa ctkIconEnginePlugin::setSizeDirectories
+  void setSizeDirectories(const QStringList& sizeDirectories);
+  QStringList sizeDirectories()const;
+
+protected:
+  QScopedPointer<ctkIconEnginePluginPrivate> d_ptr;
+
+private:
+  Q_DECLARE_PRIVATE(ctkIconEnginePlugin);
+  Q_DISABLE_COPY(ctkIconEnginePlugin);
+};
+
+//------------------------------------------------------------------------------
+/// \ingroup Widgets
+/// ctkIconEngine is an icon engine that behaves like the default Qt icon engine
+/// QPixmapIconEngine(ctkPixmapIconEngine)), but can automatically support icons
+/// in multiple size. When adding a file to an icon, it will automatically check
+/// if the same file name exists in a different directory. This allows the
+/// application to contains icons in different size,e.g. :/Icons/Small/edit.png
+/// and :/Icons/Large/edit.png.
+/// Without ctkIconEngine, QIcon already support mutltiple files:
+/// \code
+///  QIcon editIcon;
+///  editIcon.addFile(":/Icons/Small/edit.png");
+///  editIcon.addFile(":/Icons/Large/edit.png");
+/// \endcode
+/// Using ctkIconEngine, adding a file to an icon will automatically search for
+/// any icon in a different directory:
+/// \code
+///  ctkIconEngine* autoIconEngine;
+///  autoIconEngine->setSizeDirectories(QStringList() << "Large" << "Small";
+///  QIcon editIcon(autoIconEngine);
+///  editIcon.addFile(":/Icons/Small/edit.png");
+/// \endcode
+/// where the large version of the icon is automatically added.
+/// It is mostly useful when using the designer, where only 1 icon file can
+/// be specified. It must be used with ctkIconEnginePlugin
+/// TODO: support more than just files in ressources.
+class CTK_WIDGETS_EXPORT ctkIconEngine: public ctkPixmapIconEngine
+{
+public:
+  typedef ctkPixmapIconEngine Superclass;
+  ctkIconEngine();
+  virtual ~ctkIconEngine();
+  virtual void addFile(const QString& fileName, const QSize& size,
+                       QIcon::Mode mode, QIcon::State state);
+  /// Subdirectories where the icons should be searched, typically:
+  /// "Small", "Medium", "Large", "XLarge" or
+  /// "16x16", "32x32", "64x64", "128x128" or
+  /// "LowDef", "HighDef"
+  void setSizeDirectories(const QStringList& sizeDirectories);
+  QStringList sizeDirectories()const;
+
+  virtual QString key()const;
+
+protected:
+  QScopedPointer<ctkIconEnginePrivate> d_ptr;
+
+private:
+  Q_DECLARE_PRIVATE(ctkIconEngine);
+  Q_DISABLE_COPY(ctkIconEngine);
+};
+#endif

+ 125 - 0
Libs/Widgets/ctkIconEnginePlugin_qt5.h

@@ -0,0 +1,125 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+#ifndef __ctkIconEnginePlugin_qt5_h
+#define __ctkIconEnginePlugin_qt5_h
+
+// Qt includes
+# include <QIconEngine>
+# include <QIconEnginePlugin>
+
+// CTK includes
+#include "ctkPimpl.h"
+#include "ctkPixmapIconEngine.h"
+#include "ctkWidgetsExport.h"
+
+class ctkIconEnginePluginPrivate;
+class ctkIconEnginePrivate;
+
+/// \ingroup Widgets
+/// ctkIconEnginePlugin must be loaded when starting the application.
+/// \code
+/// QApplication myApp;
+/// QCoreApplication::addLibraryPath("MyApp-build/plugins");
+/// \endcode
+/// where the plugin must be located in "MyApp-build/plugins/iconengines"
+/// don't forget to declare in the cpp file:
+///   Q_EXPORT_PLUGIN2(yourpluginName, ctkIconEnginePlugin)
+class CTK_WIDGETS_EXPORT ctkIconEnginePlugin
+  : public QIconEnginePlugin
+{
+  Q_OBJECT;
+public:
+  ctkIconEnginePlugin(QObject* parent = 0);
+  virtual ~ctkIconEnginePlugin();
+
+  virtual QIconEngine* create(const QString& filename=QString());
+
+  /// Support all the Qt image formats by default
+  virtual QStringList keys()const;
+
+  /// Directory list given to the created icon engines
+  /// Subdirectories where the icons should be searched, typically:
+  /// "Small", "Medium", "Large", "XLarge" or
+  /// "16x16", "32x32", "64x64", "128x128" or
+  /// "LowDef", "HighDef"
+  /// \sa ctkIconEnginePlugin::setSizeDirectories
+  void setSizeDirectories(const QStringList& sizeDirectories);
+  QStringList sizeDirectories()const;
+
+protected:
+  QScopedPointer<ctkIconEnginePluginPrivate> d_ptr;
+
+private:
+  Q_DECLARE_PRIVATE(ctkIconEnginePlugin);
+  Q_DISABLE_COPY(ctkIconEnginePlugin);
+};
+
+//------------------------------------------------------------------------------
+/// \ingroup Widgets
+/// ctkIconEngine is an icon engine that behaves like the default Qt icon engine
+/// QPixmapIconEngine(ctkPixmapIconEngine)), but can automatically support icons
+/// in multiple size. When adding a file to an icon, it will automatically check
+/// if the same file name exists in a different directory. This allows the
+/// application to contains icons in different size,e.g. :/Icons/Small/edit.png
+/// and :/Icons/Large/edit.png.
+/// Without ctkIconEngine, QIcon already support mutltiple files:
+/// \code
+///  QIcon editIcon;
+///  editIcon.addFile(":/Icons/Small/edit.png");
+///  editIcon.addFile(":/Icons/Large/edit.png");
+/// \endcode
+/// Using ctkIconEngine, adding a file to an icon will automatically search for
+/// any icon in a different directory:
+/// \code
+///  ctkIconEngine* autoIconEngine;
+///  autoIconEngine->setSizeDirectories(QStringList() << "Large" << "Small";
+///  QIcon editIcon(autoIconEngine);
+///  editIcon.addFile(":/Icons/Small/edit.png");
+/// \endcode
+/// where the large version of the icon is automatically added.
+/// It is mostly useful when using the designer, where only 1 icon file can
+/// be specified. It must be used with ctkIconEnginePlugin
+/// TODO: support more than just files in ressources.
+class CTK_WIDGETS_EXPORT ctkIconEngine: public ctkPixmapIconEngine
+{
+public:
+  typedef ctkPixmapIconEngine Superclass;
+  ctkIconEngine();
+  virtual ~ctkIconEngine();
+  virtual void addFile(const QString& fileName, const QSize& size,
+                       QIcon::Mode mode, QIcon::State state);
+  /// Subdirectories where the icons should be searched, typically:
+  /// "Small", "Medium", "Large", "XLarge" or
+  /// "16x16", "32x32", "64x64", "128x128" or
+  /// "LowDef", "HighDef"
+  void setSizeDirectories(const QStringList& sizeDirectories);
+  QStringList sizeDirectories()const;
+
+  virtual QString key()const;
+
+protected:
+  QScopedPointer<ctkIconEnginePrivate> d_ptr;
+
+private:
+  Q_DECLARE_PRIVATE(ctkIconEngine);
+  Q_DISABLE_COPY(ctkIconEngine);
+};
+#endif

+ 10 - 3
Libs/Widgets/ctkPixmapIconEngine.h

@@ -22,7 +22,14 @@
 #ifndef __ctkPixmapIconEngine_h
 #define __ctkPixmapIconEngine_h
 
-#include <QIconEngineV2>
+#include <QtGlobal>
+
+#if QT_VERSION >= 0x050000
+# include <QIconEngine>
+#else
+# include <QIconEngineV2>
+#endif
+
 #include <QPixmap>
 #include <QVector>
 
@@ -46,7 +53,7 @@ struct ctkPixmapIconEngineEntry
 
 /// \ingroup Widgets
 class CTK_WIDGETS_EXPORT ctkPixmapIconEngine
-#if QT_VERSION >= 0x50000
+#if QT_VERSION >= 0x050000
   : public QIconEngine
 #else
   : public QIconEngineV2
@@ -65,7 +72,7 @@ public:
 
     // v2 functions
     QString key() const;
-#if QT_VERSION >= 0x50000
+#if QT_VERSION >= 0x050000
     QIconEngine *clone() const;
 #else
     QIconEngineV2 *clone() const;