Как создать пользовательский плагин (виджет) для Qt Designer с помощью cmake (и Visual Studio)

Количество учебных пособий, как создать плагин QT Designer очень мало … и те, которые я нашел, всегда используют QT Creator (как этот: http://qt-project.org/doc/qt-4.8/designer-customwidgetplugin.html ). Где я должен добавить некоторые определения qt в .pro файл

 CONFIG      += designer plugin

Я использую CMake и Visual Studio для кодирования, поэтому было бы очень здорово, если бы кто-то мог сказать мне, как я успешно создаю .dll, которую я могу поместить в папку plugins / designer, чтобы пользовательский виджет отображался в Qt Designer

5

Решение

Отказ от ответственности: я знаю, что это старый вопрос, но даже сейчас я не нашел полных ресурсов о том, как это сделать.

Я не могу ответить вам за часть Visual Studio, так как я использую командную строку (windows), но вот мой cmake.

Я предполагаю, что вы уже создали следующие файлы, связанные с плагином, т.е.

  • widget.h
  • widget.cpp
  • widget.ui
  • widgetPlugin.h -> QDesignerCustomWidgetInterface учебный класс
  • widgetPlugin.cpp

И что вы хотите создать библиотеку с несколькими плагинами, то есть создали связанные файлы:

  • plugins.h -> QDesignerCustomWidgetCollectionInterface учебный класс
  • plugins.cpp

Содержание файлов просто соответствует тому, что в учебниках.

CMakeLists.txt это:

cmake_minimum_required(VERSION 2.8)

set(PROJECT Plugins)
project(${PROJECT})

# Needed to compile against ui and moc generated files
include_directories(${CMAKE_CURRENT_BINARY_DIR})

set(SOURCES
plugins.cpp
widgetPlugin.cpp
widget.cpp
)

set(HEADERS
plugins.h
widgetPlugin.h
widget.h
)

set(FORMS
widget.ui
)

# This is experimental, it works but it may be not optimal, don't hesitate to change this
find_package(Qt4 REQUIRED QtCore QtGui QtDesigner)
if (QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND AND QT_QTDESIGNER_FOUND)
set(QT_USE_QTDESIGNER TRUE)
include(${QT_USE_FILE})
else()
message(FATAL_ERROR "no qt...")
endif()

qt4_wrap_cpp(HEADERS_MOC ${HEADERS})
qt4_wrap_ui(FORMS_HEADERS ${FORMS})
qt4_add_resources(RESOURCES_RCC ${RESOURCES})

# Here too, I'm not sure every define is necessary
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_definitions(-DQT_PLUGIN)
add_definitions(-DQT_NO_DEBUG)
add_definitions(-DQT_SHARED)
add_definitions(-DQDESIGNER_EXPORT_WIDGETS)

add_library(${PROJECT} SHARED
${SOURCES}
${HEADERS_MOC}
${FORMS_HEADERS}
${RESOURCES_RCC}
)
target_link_libraries(${PROJECT} ${QT_LIBRARIES})

# Install the library in QtDesigner plugin directory
install(TARGETS ${PROJECT}
DESTINATION ${QT_PLUGINS_DIR}/designer
)

Чтобы перезагрузить плагины в QtDesigner, перейдите в «Справка»> «О плагинах»> «Перезагрузить».

Затем в другой CMakeLists.txt я не хотел включать библиотеку, так как есть также бесполезные файлы плагинов. Поэтому я снова включил нужные файлы:

cmake_minimum_required(VERSION 2.8)

set(PROJECT GPAUSX)
project(${PROJECT})

# Include the other CMakeLists.txt
subdirs(Plugins)
find_package(Qt4 REQUIRED)

# Files to insert
set(SOURCES
main.cpp
MainWindow.cpp
${Plugins_SOURCE_DIR}/widget.cpp

)
set(HEADERS
MainWindow.h
${Plugins_SOURCE_DIR}/widget.h

)
set(FORMS
MainWindow.ui
${Plugins_SOURCE_DIR}/widget.ui
)

qt4_wrap_cpp(HEADERS_MOC ${HEADERS})
qt4_wrap_ui(FORMS_HEADERS ${FORMS})
qt4_add_resources(RESOURCES_RCC ${RESOURCES})

include(${QT_USE_FILE})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_definitions(${QT_DEFINITIONS})
# I'm no expert in libraries so, intuitively I'd say this is useless but it won't compile if I don't define it.
# This clearly needs to get fixed.
add_definitions(-DQDESIGNER_EXPORT_WIDGETS)

# Possible variants making it compile :
# 1/ either include Plugins_BINARY_DIR or include .uis
#   including the binary dir makes use of the already generated .uis
# 2/ either target Plugins or add Plugins .uis, .hs and .cpps with -DQDESIGNER_EXPORT_WIDGETS
#   if you target plugins, make sure you compile with the same flags

add_executable(${PROJECT}
${SOURCES}
${HEADERS_MOC}
${FORMS_HEADERS}
${RESOURCES_RCC}
)
target_link_libraries(${PROJECT}
# Uncomment the following if you want to target Plugins
#Plugins
${QT_LIBRARIES}
)

Надеюсь, вы найдете это полезным!

4

Другие решения

Просто используйте инструменты qt auto cmake и добавьте все источники (.cpp .ui .qrc и т. Д.) К цели следующим образом:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt4 REQUIRED QtCore QtGui QtDesigner #...
)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})

add_library(someplugin SHARED
path/to/plugin/someplugin.cpp
path/to/plugin/someplugin.qrc
path/to/plugin/someplugin.ui
path/to/plugin/s/other/src.cpp
#...
)

target_link_libraries(someplugin ${QT_LIBRARIES})

install(TARGETS someplugin
DESTINATION ${QT_PLUGINS_DIR}/designer
)
0

По вопросам рекламы [email protected]