используя qt с adtf. Создание файла moc во время сборки?
Я пытаюсь использовать qt с adtf 3.3.
Из документации adtf (https://support.digitalwerk.net/adtf/v3/adtf_html/page_external_dependencies.html) и примера из adtf с использованием qt(https://support.digitalwerk.net/adtf/v3/adtf_html/play_demo_dis .html).
Краткое введение о том, что я пытаюсь сделать.
Я создал один файл пользовательского интерфейса с помощью QtDesigner, а затем сгенерировал вручную файл заголовка с помощью компилятора uic, а затем также сгенерировал файл moc, поскольку у меня есть функции сигналов и слотов, мне также нужен файл moc для вызова метаобъектов.
Итак, теперь я хотел бы вместо того, чтобы вручную создавать файл заголовка с использованием файлов uic и moc, я хотел сгенерировать файл moc во время сборки, используя
set(CMAKE_AUTOMOC_ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
причина, по которой я делаю это, если я изменяю некоторые функции или добавляю сигнал и слоты, тогда мне нужно сгенерировать отдельный и добавить в исходный файл.
Итак, в основном мой заголовочный файл, сгенерированный uic, содержит информацию об объектах, используемых в форме qt. В основном он переводит тип файла xml, который содержит информацию об ui, в файл заголовка с помощью компилятора uic.
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QPlainTextEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTableWidget>
#include <QtWidgets/QWidget>
#include <QLineEdit>
QT_BEGIN_NAMESPACE
class Ui_Form
{
public:
QGroupBox *groupBox_dummy;
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
Form->setObjectName(QStringLiteral("Form"));
//Form->resize(960, 480);
Form->setFixedSize(960, 480);
/*Contains several qobjects removed intentionally as it makes post so long*/
retranslateUi(Form);
QMetaObject::connectSlotsByName(Form);
} // setupUi
void retranslateUi(QWidget *Form)
{
} // retranslateUi
};
namespace Ui {
class Form: public Ui_Form {};
} // namespace Ui
QT_END_NAMESPACE
а затем у меня есть файл moc, созданный моим компилятором moc, они всегда генерируются для всех классов QObject. Они абсолютно необходимы для работы мета, например, такие вещи, как: сигналы.
Мои списки CMAKELists выглядят так
set (CMAKE_CXX_STANDARD 11)
include(FetchContent)
find_package(ADTF REQUIRED HINTS ${ADTF_DIR} COMPONENTS filtersdk ui)
adtf_use_qt(Widgets)
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
find_package(Eigen3 CONFIG REQUIRED HINTS ${CMAKE_SOURCE_DIR}/libs/eigen/share/eigen3/cmake)
set(OpenCV_STATIC ON)
find_package(OpenCV CONFIG REQUIRED HINTS ${CMAKE_SOURCE_DIR}/libs/opencv)
# include directories
include_directories(inc)
include_directories(${CMAKE_BINARY_DIR})
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${EIGEN3_INCLUDE_DIR})
# specify target
set(TARGET_NAME dummy)
set (TARGET_SOURCES
inc/uic_dummy.h->file generated by uic compiler. this code snipper is shown above
inc/dummy.h -> this basically contains several methods like createview and severalt hings and also slots (for qt functionality)
inc/stdafx.h -> contains all includes in this file
src/dummy.cpp->definitions of all the functions mentioned in dummy.h
src/moc_dummy.cpp-> moc file everytime i need to keep in the sources list. However i want to generate it in build time instead of saying like this uisng CMAKE_AUTOMOC ON
)
adtf_add_filter(${TARGET_NAME} ${TARGET_SOURCES})
target_link_libraries(${TARGET_NAME} PRIVATE Qt5::Widgets ${OpenCV_LIBS} adtf::ui)
adtf_disable_qt_warnings(${TARGET_NAME})
adtf_install_target(${TARGET_NAME} ${CMAKE_INSTALL_PREFIX}/dummy/dummy)
adtf_create_plugindescription(
/*removed intentionall as it is not the area of the concern in this scenario*/
)
Итак, мой вопрос: могу ли я сгенерировать файл moc во время сборки?
Поскольку я использую adtf_use_qt(виджеты), а в cmake gui я указываю qt_dir, тогда все работает нормально. Однако мне нужно сохранить файл moc в источниках.
Normally when i use qt withouf adtf i basicall use find_package(qt) and also use
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE AUTORCC ON)
Then i will only keep my ui file in the sources and then it generates
everyhting forme. Ideally i would like to know if i can do the same for adtf.
Пожалуйста, извините меня, если мой вопрос не ясен. Если вам нужна дополнительная информация, спрашивайте, я постараюсь уточнить это гораздо лучше. Спасибо
1 ответ
у вас все еще возникают проблемы с созданием файлов moc? Возможно, вам нужно только добавить файл xxx.ui в источники фильтра. Ui_xxx.h может быть включен в исходных файлах.
Например:
set(PLUGIN_TARGETNAME your_filter)
adtf_add_filter(${PLUGIN_TARGETNAME}
${PLUGIN_TARGETNAME}.h
${PLUGIN_TARGETNAME}.cpp
${PLUGIN_TARGETNAME}.ui
)
target_link_libraries(${PLUGIN_TARGETNAME} PRIVATE
adtf::systemsdk
adtf::filtersdk
adtf::ui)
set_target_properties(${PLUGIN_TARGETNAME} PROPERTIES FOLDER src)
adtf_create_plugindescription(
TARGET ${PLUGIN_TARGETNAME}
PLUGIN_SUBDIR "bin")
set_target_properties(${PLUGIN_TARGETNAME}
PROPERTIES AUTOMOC ON AUTOUIC ON AUTOGEN_TARGET_DEPENDS ${PLUGIN_TARGETNAME}.ui)