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, как я. Ссылки:


Что я сделал до сих пор:

Мой 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".

0 ответов

Другие вопросы по тегам