From c14d6a6dd6ff53f9c5a24287ad174eb858aca6a5 Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Mon, 10 Aug 2026 17:57:39 +0200 Subject: [PATCH] In order to migrate to Qt6 all options for KF6 were added: a) using a system provided KF6 b) downloading and compiling KF6 c) using the vendored-in re-creation of the functionality The behaviour for both Qt5 and Qt6 is steered with the same two variables which were renamed to become version agnostic: a) BUILD_WITH_KF=ON BUILD_KF=OFF b) BUILD_WITH_KF=ON BUILD_KF=ON c) BUILD_WITH_KF=OFF The version is automatically derived from the chosen Qt major version. --- .github/workflows/windows-build.yml | 2 +- CMakeLists.txt | 66 ++++++++++++-------- build-aux/windows/nsis_base/files/README.md | 4 +- cmake/define_definitions.cmake | 6 +- cmake/developer_options.cmake | 7 ++- cmake/fetch_kdeaddons.cmake | 43 +++++++++---- cmake/qet_compilation_vars.cmake | 2 +- sources/editor/ui/dynamictextfieldeditor.cpp | 4 +- sources/editor/ui/dynamictextfieldeditor.h | 4 +- sources/editor/ui/terminaleditor.cpp | 6 +- sources/editor/ui/terminaleditor.h | 4 +- sources/editor/ui/texteditor.cpp | 4 +- sources/editor/ui/texteditor.h | 4 +- sources/qetapp.cpp | 2 +- sources/qetdiagrameditor.cpp | 2 +- sources/qetproject.h | 2 +- tests/catch/CMakeLists.txt | 4 +- tests/googlemock/CMakeLists.txt | 2 +- tests/googletest/CMakeLists.txt | 2 +- tests/qttest/CMakeLists.txt | 2 +- 20 files changed, 104 insertions(+), 68 deletions(-) diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index dd5cdfb45..e41a6cf5a 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -456,7 +456,7 @@ jobs: -DCMAKE_PREFIX_PATH=/ucrt64 \ -DQt6_DIR=/ucrt64/lib/cmake/Qt6 \ -DQT_VERSION_MAJOR=6 \ - -DBUILD_WITH_KF5=OFF \ + -DBUILD_WITH_KF=OFF \ -DPACKAGE_TESTS=OFF \ -DCMAKE_POLICY_DEFAULT_CMP0077=NEW \ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 45b539de4..a06bf1fde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,19 +48,11 @@ endif() # INTERFACE_QT_MAJOR_VERSION mismatch at generate time. set(QT_DEFAULT_MAJOR_VERSION ${QT_VERSION_MAJOR} CACHE STRING "Qt version to use (5 or 6)" FORCE) -# Add sub directories -option(PACKAGE_TESTS "Build the tests" ON) -if(PACKAGE_TESTS) - message("Add sub directory tests") - add_subdirectory(tests) -endif() - include(cmake/paths_compilation_installation.cmake) include(cmake/start_options.cmake) include(cmake/developer_options.cmake) include(cmake/git_update_submodules.cmake) include(cmake/git_last_commit_sha.cmake) -include(cmake/fetch_kdeaddons.cmake) include(cmake/fetch_singleapplication.cmake) include(cmake/fetch_pugixml.cmake) include(cmake/qet_compilation_vars.cmake) @@ -100,25 +92,19 @@ endif() set(CMAKE_AUTOUIC_SEARCH_PATHS ${QET_DIR}/sources/ui) -# The default build only compiles the tracked .ts files to .qm (lrelease). -# Refreshing the .ts from the sources (lupdate) is a developer action behind -# the explicit "update_translations" target below: running lupdate on every -# build rewrote tracked files as a side effect, and under high parallelism -# lupdate rewriting a .ts while lrelease read the same file made the build -# fail with "Premature end of document". -set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${QET_DIR}/lang") if(QT_VERSION_MAJOR EQUAL 6) - qt6_add_translation(QM_FILES ${TS_FILES}) + set(KF_MAJOR_VERSION 6) else() - qt5_add_translation(QM_FILES ${TS_FILES}) + set(KF_MAJOR_VERSION 5) endif() +include(cmake/fetch_kdeaddons.cmake) -add_custom_target(update_translations - COMMAND $ ${CMAKE_SOURCE_DIR}/sources -ts ${TS_FILES} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Updating .ts files from sources/ (lupdate) - developer target, run explicitly" - VERBATIM -) +# Add sub directories +option(PACKAGE_TESTS "Build the tests" ON) +if(PACKAGE_TESTS) + message("Add sub directory tests") + add_subdirectory(tests) +endif() # als laatse include(cmake/define_definitions.cmake) @@ -145,6 +131,36 @@ else() ) endif() +# The default build only compiles the tracked .ts files to .qm (lrelease). +# Refreshing the .ts from the sources (lupdate) is a developer action behind +# the explicit "update_translations" target below: running lupdate on every +# build rewrote tracked files as a side effect, and under high parallelism +# lupdate rewriting a .ts while lrelease read the same file made the build +# fail with "Premature end of document". +if(QT_VERSION_MAJOR EQUAL 6) + qt_add_lrelease( + TARGETS ${PROJECT_NAME} + TS_FILES ${TS_FILES} + QM_OUTPUT_DIRECTORY "${QET_DIR}/lang" + QM_FILES_OUTPUT_VARIABLE QM_FILES + ) + qt_add_lupdate( + TS_FILES ${TS_FILES} + SOURCE_TARGETS ${PROJECT_NAME} + LUPDATE_TARGET update_translations + COMMENT "Updating .ts files from sources/ (lupdate) - developer target, run explicitly" + ) +else() + qt5_add_translation(QM_FILES ${TS_FILES}) + set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${QET_DIR}/lang") + add_custom_target(update_translations + COMMAND $ ${CMAKE_SOURCE_DIR}/sources -ts ${TS_FILES} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Updating .ts files from sources/ (lupdate) - developer target, run explicitly" + VERBATIM + ) +endif() + # Optional precompiled headers -- see QET_ENABLE_PCH in # cmake/developer_options.cmake for what this trades away. # @@ -180,7 +196,7 @@ target_link_libraries( pugixml::pugixml SingleApplication::SingleApplication SQLite3::SQLite3 - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES} ) @@ -221,7 +237,7 @@ target_include_directories( ${QET_DIR}/sources/svg ) -if(NOT BUILD_WITH_KF5) +if(NOT BUILD_WITH_KF) target_include_directories( ${PROJECT_NAME} PRIVATE diff --git a/build-aux/windows/nsis_base/files/README.md b/build-aux/windows/nsis_base/files/README.md index 310f8abf7..b90d792de 100644 --- a/build-aux/windows/nsis_base/files/README.md +++ b/build-aux/windows/nsis_base/files/README.md @@ -40,8 +40,8 @@ git clone --recursive https://github.com/qelectrotech/qelectrotech-source-mirror Here are the technical choices made for the software development: * Integrated development environment: [Qt Framework](https://www.qt.io/ide/) -* Libraries: Qt 5.x -* [KF5 Framework](https://github.com/KDE) +* Libraries: Qt 5.x / Qt 6.x +* [KF5/6 Framework](https://github.com/KDE) [Cmake](https://cmake.org/install/) [kcoreaddons](https://github.com/KDE/kcoreaddons/tree/kf5) [kwidgetsaddons](https://github.com/KDE/kwidgetsaddons/tree/kf5). diff --git a/cmake/define_definitions.cmake b/cmake/define_definitions.cmake index 7f9cb6ae0..6b8ef87f3 100644 --- a/cmake/define_definitions.cmake +++ b/cmake/define_definitions.cmake @@ -62,10 +62,10 @@ message("PROJECT_SOURCE_DIR :" ${PROJECT_SOURCE_DIR}) message("QET_DIR :" ${QET_DIR}) message("GIT_COMMIT_SHA :" ${GIT_COMMIT_SHA}) -if(BUILD_WITH_KF5) - message("KF5_GIT_TAG :" ${KF5_GIT_TAG}) +if(BUILD_WITH_KF) + message("KF_GIT_TAG :" ${KF5_GIT_TAG}) else() - add_definitions(-DBUILD_WITHOUT_KF5) + add_definitions(-DBUILD_WITHOUT_KF) endif() message("QET_COMPONENTS :" ${QET_COMPONENTS}) message("QT_VERSION_MAJOR :" ${QT_VERSION_MAJOR}) diff --git a/cmake/developer_options.cmake b/cmake/developer_options.cmake index cec095273..23f0799fa 100644 --- a/cmake/developer_options.cmake +++ b/cmake/developer_options.cmake @@ -31,8 +31,11 @@ add_definitions(-DQT_MESSAGELOGCONTEXT) # In order to do so, uncomment the following line. #add_definitions(-DTODO_LIST) -# Build with KF5 -option(BUILD_WITH_KF5 "Build with KF5" ON) +# Build with KDE Frameworks. The major version (KF5/KF6) is derived +# automatically from QT_VERSION_MAJOR -- KDE Frameworks deliberately +# mirrors Qt's own major version numbering, so there is no independent +# choice to make here. See cmake/fetch_kdeaddons.cmake. +option(BUILD_WITH_KF "Build with KDE Frameworks" ON) # Precompiled headers for the Qt umbrella headers. # diff --git a/cmake/fetch_kdeaddons.cmake b/cmake/fetch_kdeaddons.cmake index 0867afec4..d5f3affcf 100644 --- a/cmake/fetch_kdeaddons.cmake +++ b/cmake/fetch_kdeaddons.cmake @@ -16,17 +16,24 @@ message(" - fetch_kdeaddons") -if(BUILD_WITH_KF5) +# TODO remove path as soon as Qt5 gets retired +if(BUILD_WITH_KF) Include(FetchContent) - option(BUILD_KF5 "Build KF5 libraries, use system ones otherwise" YES) + option(BUILD_KF "Build KF5 libraries, use system ones otherwise" YES) - if(BUILD_KF5) + if(BUILD_KF) - if(NOT DEFINED KF5_GIT_TAG) + if(KF_MAJOR_VERSION EQUAL 5) + if(NOT DEFINED KF_GIT_TAG) #https://qelectrotech.org/forum/viewtopic.php?pid=13924#p13924 - set(KF5_GIT_TAG v5.77.0) + set(KF_GIT_TAG v5.77.0) endif() + else() + if(NOT DEFINED KF_GIT_TAG) + set(KF_GIT_TAG v6.10.0) + endif() + endif() # Fix stop the run autotests of kcoreaddons # see @@ -38,30 +45,40 @@ if(BUILD_WITH_KF5) # https://qelectrotech.org/forum/viewtopic.php?pid=13929#p13929 set(KDE_SKIP_TEST_SETTINGS "TRUE") set(BUILD_TESTING "0") + + # QElectroTech is a plain QtWidgets application with no QML anywhere in + # it; these disable optional features of the fetched KF modules that + # would otherwise pull in extra Qt6 components (e.g. Qt6Qml) we don't + # have and don't need. + set(BUILD_DESIGNERPLUGIN OFF) + set(KCOREADDONS_USE_QML OFF) + set(BUILD_QCH OFF) + set(BUILD_SHARED_LIBS OFF) + FetchContent_Declare( ecm GIT_REPOSITORY https://invent.kde.org/frameworks/extra-cmake-modules.git - GIT_TAG ${KF5_GIT_TAG}) + GIT_TAG ${KF_GIT_TAG}) FetchContent_MakeAvailable(ecm) FetchContent_Declare( kcoreaddons GIT_REPOSITORY https://invent.kde.org/frameworks/kcoreaddons.git - GIT_TAG ${KF5_GIT_TAG}) + GIT_TAG ${KF_GIT_TAG}) FetchContent_MakeAvailable(kcoreaddons) FetchContent_Declare( kwidgetsaddons GIT_REPOSITORY https://invent.kde.org/frameworks/kwidgetsaddons.git - GIT_TAG ${KF5_GIT_TAG}) + GIT_TAG ${KF_GIT_TAG}) FetchContent_MakeAvailable(kwidgetsaddons) else() - find_package(KF5CoreAddons REQUIRED) - find_package(KF5WidgetsAddons REQUIRED) + find_package(KF${KF_MAJOR_VERSION}CoreAddons REQUIRED) + find_package(KF${KF_MAJOR_VERSION}WidgetsAddons REQUIRED) endif() - set(KF5_PRIVATE_LIBRARIES - KF5::WidgetsAddons - KF5::CoreAddons + set(KF_PRIVATE_LIBRARIES + KF${KF_MAJOR_VERSION}::WidgetsAddons + KF${KF_MAJOR_VERSION}::CoreAddons ) endif() diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake index c0daa3aca..112e6dea5 100644 --- a/cmake/qet_compilation_vars.cmake +++ b/cmake/qet_compilation_vars.cmake @@ -801,7 +801,7 @@ set(QET_SRC_FILES ${QET_DIR}/sources/xml/terminalstriplayoutpatternxml.h ) -if(NOT BUILD_WITH_KF5) +if(NOT BUILD_WITH_KF) list(APPEND QET_SRC_FILES ${QET_DIR}/sources/ui/nokde/kautosavefile.cpp ${QET_DIR}/sources/ui/nokde/kautosavefile.h diff --git a/sources/editor/ui/dynamictextfieldeditor.cpp b/sources/editor/ui/dynamictextfieldeditor.cpp index 145dd959a..f1a806935 100644 --- a/sources/editor/ui/dynamictextfieldeditor.cpp +++ b/sources/editor/ui/dynamictextfieldeditor.cpp @@ -141,7 +141,7 @@ void DynamicTextFieldEditor::updateForm() ui -> m_size_sb -> setValue(m_text_field.data() -> font().pointSize()); ui->m_keep_visual_rotation_cb->setChecked(m_text_field.data()->keepVisualRotation()); ui->m_rotation_point_center_cb->setChecked(m_text_field.data()->rotationPointCenter()); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else m_color_kpb -> setColor(m_text_field.data() -> color()); #endif @@ -170,7 +170,7 @@ void DynamicTextFieldEditor::updateForm() void DynamicTextFieldEditor::setupWidget() { -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else m_color_kpb = new KColorButton(this); m_color_kpb->setObjectName(QString::fromUtf8("m_color_kpb")); diff --git a/sources/editor/ui/dynamictextfieldeditor.h b/sources/editor/ui/dynamictextfieldeditor.h index e2f4662e3..726ff9694 100644 --- a/sources/editor/ui/dynamictextfieldeditor.h +++ b/sources/editor/ui/dynamictextfieldeditor.h @@ -21,7 +21,7 @@ #include "../elementitemeditor.h" #include "../graphicspart/partdynamictextfield.h" -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else # include #endif @@ -79,7 +79,7 @@ class DynamicTextFieldEditor : public ElementItemEditor { QList m_parts; QList m_connection_list; - #ifdef BUILD_WITHOUT_KF5 + #ifdef BUILD_WITHOUT_KF #else KColorButton* m_color_kpb = nullptr; #endif diff --git a/sources/editor/ui/terminaleditor.cpp b/sources/editor/ui/terminaleditor.cpp index 6456978e7..f3d23b7d9 100644 --- a/sources/editor/ui/terminaleditor.cpp +++ b/sources/editor/ui/terminaleditor.cpp @@ -40,7 +40,7 @@ TerminalEditor::TerminalEditor(QETElementEditor *editor, QWidget *parent) : { ui->setupUi(this); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF m_color_pb = new QPushButton(this); m_color_pb->setMinimumSize(40, 24); connect(m_color_pb, &QPushButton::clicked, this, &TerminalEditor::labelColorClicked); @@ -93,7 +93,7 @@ void TerminalEditor::updateForm() ui->m_label_rotation_sb->setValue(static_cast(m_part->labelRotation())); ui->m_label_frame_cb->setChecked(m_part->labelFrame()); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF QPixmap px(16, 16); px.fill(m_part->labelColor()); m_color_pb->setIcon(QIcon(px)); @@ -410,7 +410,7 @@ void TerminalEditor::labelColorClicked() if (m_locked) return; m_locked = true; -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF QColor new_color = QColorDialog::getColor(m_part->labelColor(), this); if (new_color.isValid() && m_part->labelColor() != new_color) { auto undo = new QPropertyUndoCommand(m_part, "label_color", m_part->labelColor(), new_color); diff --git a/sources/editor/ui/terminaleditor.h b/sources/editor/ui/terminaleditor.h index d0ebf6098..7c15d9f2c 100644 --- a/sources/editor/ui/terminaleditor.h +++ b/sources/editor/ui/terminaleditor.h @@ -21,7 +21,7 @@ #include #include "../elementitemeditor.h" -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #include #else #include @@ -78,7 +78,7 @@ class TerminalEditor : public ElementItemEditor m_change_connections; PartTerminal *m_part = nullptr; bool m_locked = false; -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF QPushButton *m_color_pb; #else KColorButton *m_color_pb; diff --git a/sources/editor/ui/texteditor.cpp b/sources/editor/ui/texteditor.cpp index fd0b3e74f..db600d147 100644 --- a/sources/editor/ui/texteditor.cpp +++ b/sources/editor/ui/texteditor.cpp @@ -63,7 +63,7 @@ void TextEditor::updateForm() m_rotation_sb -> setValue(m_text -> rotation()); m_size_sb -> setValue(m_text -> font().pointSize()); m_font_pb -> setText(m_text -> font().family()); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else m_color_pb -> setColor(m_text -> defaultTextColor()); #endif @@ -346,7 +346,7 @@ void TextEditor::setUpWidget(QWidget *parent) m_line_edit->setPlaceholderText(tr("Entrer votre texte ici")); gridLayout->addWidget(m_line_edit, 0, 0, 1, 6); -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else m_color_pb = new KColorButton(parent); m_color_pb->setObjectName(QString::fromUtf8("m_color_pb")); diff --git a/sources/editor/ui/texteditor.h b/sources/editor/ui/texteditor.h index 7dd207eba..dd860ee10 100644 --- a/sources/editor/ui/texteditor.h +++ b/sources/editor/ui/texteditor.h @@ -25,7 +25,7 @@ #include #include #include -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else #include #endif @@ -65,7 +65,7 @@ class TextEditor : public ElementItemEditor { QSpinBox *m_size_sb; QLineEdit *m_line_edit; QPushButton *m_font_pb; -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF #else KColorButton *m_color_pb; #endif diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index 95d84a4d0..45b4a1800 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -50,7 +50,7 @@ #include #include #include -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF # include "ui/nokde/kautosavefile.h" #else # include diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 44353b655..d7b002a50 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -57,7 +57,7 @@ #include #include #include -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF # include "ui/nokde/kautosavefile.h" #else # include diff --git a/sources/qetproject.h b/sources/qetproject.h index 3817abad9..5ec4f4ae7 100644 --- a/sources/qetproject.h +++ b/sources/qetproject.h @@ -29,7 +29,7 @@ #include "titleblock/templatescollection.h" #include "titleblockproperties.h" #include "diagram.h" -#ifdef BUILD_WITHOUT_KF5 +#ifdef BUILD_WITHOUT_KF # include "ui/nokde/kautosavefile.h" #else # include diff --git a/tests/catch/CMakeLists.txt b/tests/catch/CMakeLists.txt index 78118032c..aa7872bd1 100644 --- a/tests/catch/CMakeLists.txt +++ b/tests/catch/CMakeLists.txt @@ -90,7 +90,7 @@ add_executable( ${QET_DIR}/sources/borderproperties.h ) -if(NOT BUILD_WITH_KF5) +if(NOT BUILD_WITH_KF) target_sources( ${PROJECT_NAME} PRIVATE @@ -109,7 +109,7 @@ target_link_libraries( PUBLIC Catch2::Catch2 PRIVATE - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES}) if (DEFINED ENV{CATCH_INCLUDE_DIR}) diff --git a/tests/googlemock/CMakeLists.txt b/tests/googlemock/CMakeLists.txt index db29ef8c9..a8e4dbb76 100644 --- a/tests/googlemock/CMakeLists.txt +++ b/tests/googlemock/CMakeLists.txt @@ -85,6 +85,6 @@ target_link_libraries( PUBLIC gmock gmock_main PRIVATE - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES}) diff --git a/tests/googletest/CMakeLists.txt b/tests/googletest/CMakeLists.txt index bcc85b4de..4ed488f57 100644 --- a/tests/googletest/CMakeLists.txt +++ b/tests/googletest/CMakeLists.txt @@ -84,6 +84,6 @@ target_link_libraries( PUBLIC gtest gtest_main PRIVATE - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES}) diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index 41137a3e5..6908716ff 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -74,6 +74,6 @@ target_link_libraries( ${PROJECT_NAME} PRIVATE Qt::Test - ${KF5_PRIVATE_LIBRARIES} + ${KF_PRIVATE_LIBRARIES} ${QET_PRIVATE_LIBRARIES})