Qt5 - CMake - Добавить пользовательский виджет в конструктор
Я новичок в Qt, и я застрял, пытаясь добавить настраиваемый виджет в Qt Designer. Я хотел бы получить некоторую помощь, если кто-нибудь из вас знает, как это сделать.
Что я использую:
ОС: Windows
IDE: Clion / Qt Creator
CMake: 3,5
Qt: 5
Что я пытаюсь сделать:
Я создал кнопку под названием PolygonButtonWidget(cpp/h), которая содержит реализацию этой кнопки. Кроме того, я создал PolygonWidgetPlugin(cpp / h), который состоит из необходимых интерфейсов для добавления моего пользовательского виджета в конструктор.
Короче говоря, я пытаюсь сделать так, чтобы моя кнопка отображалась здесь. Я пытался следовать этим ссылкам, но я застрял, потому что либо используются Qt4 вместо Qt5, либо они используют файл .pro вместо CMake, как я. Ссылки:
- Добавление виджетов в Qt Designer
- как создать собственный плагин (виджет) для qt-дизайнера с помощью cmake (и Visual Studio)
- как создавать плагины (Qt 5.2.0)
- QT Docs: QDesignerCustomWidgetInterface
- QT Docs: Создание пользовательских виджетов для Qt Designer
Что я сделал до сих пор:
Мой CMake:
Итак... Насколько я понял, мне нужно иметь 2 торта, один для реального проекта, а другой для моей библиотеки (для моего пользовательского виджета).
Проект CMake:
cmake_minimum_required(VERSION 3.5)
project(Qt-MainWindow LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR})
include(windeployqt)
find_package(Qt5 COMPONENTS Widgets Core Gui REQUIRED)
get_target_property(QtCore_location Qt5::Core LOCATION)
set(QT_MINGW ${QtCore_location}/../..)
message(${QT_MINGW})
add_executable(Vlad-Qt-MainWindow
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${QT_MINGW}/bin/libgcc_s_seh-1.dll $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy ${QT_MINGW}/bin/libstdc++-6.dll $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy ${QT_MINGW}/bin/libwinpthread-1.dll $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMENT "Deploy mingw runtime libraries from ${QT_MINGW}/bin"
)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets Qt5::Core Qt5::Gui)
windeployqt(${PROJECT_NAME})
Пользовательский виджет CMake:
cmake_minimum_required(VERSION 3.5)
set(PLUGIN PluginPrj)
project(${PLUGIN})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(SOURCES
PolygonWidgetPlugin.cpp
PolygonButtonWidget.cpp
)
set(HEADERS
PolygonWidgetPlugin.h
PolygonButtonWidget.h
)
find_package(Qt5 REQUIRED Core Gui Designer)
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(${PLUGIN} SHARED
${SOURCES}
${HEADERS}
)
target_link_libraries(${PLUGIN} ${QT_LIBRARIES})
install(TARGETS ${PLUGIN}
DESTINATION ${QT_PLUGINS_DIR}/designer
)
PolygonButtonWidget.h
class PolygonButtonWidget : public QWidget{
Q_OBJECT
public:
explicit PolygonButtonWidget(QWidget *parent = nullptr);
~PolygonButtonWidget() override;
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
private:
std::vector<QPoint> m_polygon;
bool inside(QPoint point, std::vector<QPoint> polygon);
};
PolygonWidgetPlugin.cpp
#include <QtCore/qplugin.h>
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
class PolygonWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
explicit PolygonWidgetPlugin(QObject *parent = nullptr);
QString name() const override;
QString includeFile() const override;
QString group() const override;
QIcon icon() const override;
QString toolTip() const override;
QString whatsThis() const override;
bool isContainer() const override;
QWidget *createWidget(QWidget *parent) override;
bool isInitialized() const override;
void initialize(QDesignerFormEditorInterface *core) override;
private:
bool initialized = false;
};
I'm not going to post the.cpp file because there is no point, but all of those functions are implemented based on the links from the references that I post above.
So based on what I wrote about could any of you explain to me what I'm doing wrong? And why my custom widget is not displayed in that list? Or any other list? In PolygonWidgetPlugin::group() I'm returing return tr("New Group");, so I was expecting to see another group named "New Group".