From 6d4214925fadc36d26aa58903db5788c742e68c6 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Wed, 2 Apr 2025 09:11:48 +0100 Subject: [PATCH] cmake: Require Qt 6 to build GUI --- .github/ISSUE_TEMPLATE/good_first_issue.yml | 2 +- CMakeLists.txt | 2 +- cmake/module/FindQt.cmake | 21 -------- doc/build-freebsd.md | 4 +- doc/build-netbsd.md | 4 +- doc/build-openbsd.md | 6 +-- doc/build-osx.md | 4 +- doc/build-unix.md | 12 +++-- src/qt/CMakeLists.txt | 58 +++++++++++++++------ src/qt/sendcoinsdialog.cpp | 13 +++++ src/qt/sendcoinsdialog.h | 4 ++ src/qt/test/CMakeLists.txt | 2 +- 12 files changed, 79 insertions(+), 53 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/good_first_issue.yml b/.github/ISSUE_TEMPLATE/good_first_issue.yml index 133937c011a..2a486b3f2b4 100644 --- a/.github/ISSUE_TEMPLATE/good_first_issue.yml +++ b/.github/ISSUE_TEMPLATE/good_first_issue.yml @@ -28,7 +28,7 @@ body: id: useful-skills attributes: label: Useful Skills - description: For example, “`std::thread`”, “Qt5 GUI and async GUI design” or “basic understanding of Bitcoin mining and the Bitcoin Core RPC interface”. + description: For example, “`std::thread`”, “Qt6 GUI and async GUI design” or “basic understanding of Bitcoin mining and the Bitcoin Core RPC interface”. value: | * Compiling Bitcoin Core from source * Running the C++ unit tests and the Python functional tests diff --git a/CMakeLists.txt b/CMakeLists.txt index bbcedcec2d6..119f4bea897 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,7 +174,7 @@ if(BUILD_GUI) if(BUILD_GUI_TESTS) list(APPEND qt_components Test) endif() - find_package(Qt 5.11.3 MODULE REQUIRED + find_package(Qt 6.2 MODULE REQUIRED COMPONENTS ${qt_components} ) unset(qt_components) diff --git a/cmake/module/FindQt.cmake b/cmake/module/FindQt.cmake index 2e43294a996..d98af5bb56b 100644 --- a/cmake/module/FindQt.cmake +++ b/cmake/module/FindQt.cmake @@ -27,19 +27,6 @@ if(CMAKE_HOST_APPLE) endif() endif() -# Save CMAKE_FIND_ROOT_PATH_MODE_LIBRARY state. -unset(_qt_find_root_path_mode_library_saved) -if(DEFINED CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) - set(_qt_find_root_path_mode_library_saved ${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}) -endif() - -# The Qt config files internally use find_library() calls for all -# dependencies to ensure their availability. In turn, the find_library() -# inspects the well-known locations on the file system; therefore, it must -# be able to find platform-specific system libraries, for example: -# /usr/x86_64-w64-mingw32/lib/libm.a or /usr/arm-linux-gnueabihf/lib/libm.a. -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) - find_package(Qt${Qt_FIND_VERSION_MAJOR} ${Qt_FIND_VERSION} COMPONENTS ${Qt_FIND_COMPONENTS} HINTS ${_qt_homebrew_prefix} @@ -47,14 +34,6 @@ find_package(Qt${Qt_FIND_VERSION_MAJOR} ${Qt_FIND_VERSION} ) unset(_qt_homebrew_prefix) -# Restore CMAKE_FIND_ROOT_PATH_MODE_LIBRARY state. -if(DEFINED _qt_find_root_path_mode_library_saved) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ${_qt_find_root_path_mode_library_saved}) - unset(_qt_find_root_path_mode_library_saved) -else() - unset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) -endif() - include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Qt REQUIRED_VARS Qt${Qt_FIND_VERSION_MAJOR}_DIR diff --git a/doc/build-freebsd.md b/doc/build-freebsd.md index 1c78b5c127a..432a2ee2bec 100644 --- a/doc/build-freebsd.md +++ b/doc/build-freebsd.md @@ -62,13 +62,13 @@ sh/bash: export BDB_PREFIX=[path displayed above] ``` #### GUI Dependencies -###### Qt5 +###### Qt6 Bitcoin Core includes a GUI built with the cross-platform Qt Framework. To compile the GUI, we need to install the necessary parts of Qt, the libqrencode and pass `-DBUILD_GUI=ON`. Skip if you don't intend to use the GUI. ```bash -pkg install qt5-buildtools qt5-core qt5-gui qt5-linguisttools qt5-testlib qt5-widgets +pkg install qt6-buildtools qt6-core qt6-gui qt6-linguisttools qt6-testlib qt6-widgets ``` ###### libqrencode diff --git a/doc/build-netbsd.md b/doc/build-netbsd.md index 988f3b93a7a..31cac3f6b68 100644 --- a/doc/build-netbsd.md +++ b/doc/build-netbsd.md @@ -64,13 +64,13 @@ pkgin install db4 ``` #### GUI Dependencies -###### Qt5 +###### Qt6 Bitcoin Core includes a GUI built with the cross-platform Qt Framework. To compile the GUI, we need to install the necessary parts of Qt, the libqrencode and pass `-DBUILD_GUI=ON`. Skip if you don't intend to use the GUI. ```bash -pkgin install qt5-qtbase qt5-qttools +pkgin install qt6-qtbase qt6-qttools ``` ###### libqrencode diff --git a/doc/build-openbsd.md b/doc/build-openbsd.md index e55f2aec9e8..8beda3259fb 100644 --- a/doc/build-openbsd.md +++ b/doc/build-openbsd.md @@ -56,13 +56,13 @@ export BDB_PREFIX="[path displayed above]" ``` #### GUI Dependencies -###### Qt5 +###### Qt6 Bitcoin Core includes a GUI built with the cross-platform Qt Framework. To compile the GUI, we need to install the necessary parts of Qt, the libqrencode and pass `-DBUILD_GUI=ON`. Skip if you don't intend to use the GUI. ```bash -pkg_add qtbase qttools +pkg_add qt6-qtbase qt6-qttools ``` ###### libqrencode @@ -100,7 +100,7 @@ pkg_add python py3-zmq # Select the newest version of the python package if nec There are many ways to configure Bitcoin Core, here are a few common examples: ##### Descriptor Wallet and GUI: -This enables descriptor wallet support and the GUI, assuming SQLite and Qt 5 are installed. +This enables descriptor wallet support and the GUI, assuming SQLite and Qt 6 are installed. ```bash cmake -B build -DBUILD_GUI=ON diff --git a/doc/build-osx.md b/doc/build-osx.md index 4d92abfc215..6f921b77827 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -92,11 +92,9 @@ Bitcoin Core includes a GUI built with the cross-platform Qt Framework. To compi Qt, libqrencode and pass `-DBUILD_GUI=ON`. Skip if you don't intend to use the GUI. ``` bash -brew install qt@5 +brew install qt@6 ``` -Note: Building may fail if Qt 6 is installed (`qt` or `qt@6`) - Note: Building with Qt binaries downloaded from the Qt website is not officially supported. See the notes in [#7714](https://github.com/bitcoin/bitcoin/issues/7714). diff --git a/doc/build-unix.md b/doc/build-unix.md index 7ebff97bbcb..df7d6f3349b 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -73,11 +73,13 @@ GUI dependencies: Bitcoin Core includes a GUI built with the cross-platform Qt Framework. To compile the GUI, we need to install the necessary parts of Qt, the libqrencode and pass `-DBUILD_GUI=ON`. Skip if you don't intend to use the GUI. - sudo apt-get install qtbase5-dev qttools5-dev qttools5-dev-tools + sudo apt-get install qt6-base-dev qt6-tools-dev qt6-l10n-tools + +For Qt 6.5 and later, the `libxcb-cursor0` package must be installed at runtime. Additionally, to support Wayland protocol for modern desktop environments: - sudo apt install qtwayland5 + sudo apt install qt6-wayland The GUI will be able to encode addresses in QR codes unless this feature is explicitly disabled. To install libqrencode, run: @@ -121,11 +123,13 @@ GUI dependencies: Bitcoin Core includes a GUI built with the cross-platform Qt Framework. To compile the GUI, we need to install the necessary parts of Qt, the libqrencode and pass `-DBUILD_GUI=ON`. Skip if you don't intend to use the GUI. - sudo dnf install qt5-qttools-devel qt5-qtbase-devel + sudo dnf install qt6-qtbase-devel qt6-qttools-devel + +For Qt 6.5 and later, the `xcb-util-cursor` package must be installed at runtime. Additionally, to support Wayland protocol for modern desktop environments: - sudo dnf install qt5-qtwayland + sudo dnf install qt6-qtwayland The GUI will be able to encode addresses in QR codes unless this feature is explicitly disabled. To install libqrencode, run: diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 797b49c624d..20c77e5bb34 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -11,21 +11,35 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") string(APPEND CMAKE_OBJCXX_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CXXFLAGS}") endif() -get_target_property(qt_lib_type Qt5::Core TYPE) +get_target_property(qt_lib_type Qt6::Core TYPE) function(import_plugins target) if(qt_lib_type STREQUAL "STATIC_LIBRARY") - set(plugins Qt5::QMinimalIntegrationPlugin) + set(plugins Qt6::QMinimalIntegrationPlugin) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND plugins Qt5::QXcbIntegrationPlugin) + list(APPEND plugins Qt6::QXcbIntegrationPlugin) elseif(WIN32) - list(APPEND plugins Qt5::QWindowsIntegrationPlugin Qt5::QWindowsVistaStylePlugin) + list(APPEND plugins Qt6::QWindowsIntegrationPlugin Qt6::QWindowsVistaStylePlugin) elseif(APPLE) - list(APPEND plugins Qt5::QCocoaIntegrationPlugin Qt5::QMacStylePlugin) + list(APPEND plugins Qt6::QCocoaIntegrationPlugin Qt6::QMacStylePlugin) endif() - qt5_import_plugins(${target} + qt6_import_plugins(${target} INCLUDE ${plugins} - EXCLUDE_BY_TYPE imageformats iconengines + EXCLUDE_BY_TYPE + accessiblebridge + platforms + platforms_darwin + xcbglintegrations + platformthemes + platforminputcontexts + generic + iconengines + imageformats + egldeviceintegrations + styles + networkaccess + networkinformation + tls ) endif() endfunction() @@ -45,7 +59,7 @@ set(CMAKE_AUTOUIC_SEARCH_PATHS forms) # to https://github.com/bitcoin-core/bitcoin-maintainer-tools/blob/main/update-translations.py file(GLOB ts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} locale/*.ts) set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/locale) -qt5_add_translation(qm_files ${ts_files}) +qt6_add_translation(qm_files ${ts_files}) configure_file(bitcoin_locale.qrc bitcoin_locale.qrc USE_SOURCE_PERMISSIONS COPYONLY) @@ -128,7 +142,7 @@ set_property(SOURCE macnotificationhandler.mm ) target_link_libraries(bitcoinqt PUBLIC - Qt5::Widgets + Qt6::Widgets PRIVATE core_interface bitcoin_cli @@ -206,19 +220,33 @@ if(ENABLE_WALLET) target_link_libraries(bitcoinqt PRIVATE bitcoin_wallet - Qt5::Network + Qt6::Network ) endif() if(WITH_DBUS) - target_link_libraries(bitcoinqt PRIVATE Qt5::DBus) + target_link_libraries(bitcoinqt PRIVATE Qt6::DBus) endif() if(qt_lib_type STREQUAL "STATIC_LIBRARY") # We want to define static plugins to link ourselves, thus preventing # automatic linking against a "sane" set of default static plugins. - qt5_import_plugins(bitcoinqt - EXCLUDE_BY_TYPE bearer iconengines imageformats platforms styles + qt6_import_plugins(bitcoinqt + EXCLUDE_BY_TYPE + accessiblebridge + platforms + platforms_darwin + xcbglintegrations + platformthemes + platforminputcontexts + generic + iconengines + imageformats + egldeviceintegrations + styles + networkaccess + networkinformation + tls ) endif() @@ -321,8 +349,8 @@ else() file(GLOB ui_files ${CMAKE_CURRENT_SOURCE_DIR}/forms/*.ui) add_custom_target(translate COMMAND ${CMAKE_COMMAND} -E env XGETTEXT=${XGETTEXT_EXECUTABLE} COPYRIGHT_HOLDERS=${COPYRIGHT_HOLDERS} ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/share/qt/extract_strings_qt.py ${translatable_sources} - COMMAND Qt5::lupdate -no-obsolete -I ${PROJECT_SOURCE_DIR}/src -locations relative ${CMAKE_CURRENT_SOURCE_DIR}/bitcoinstrings.cpp ${ui_files} ${qt_translatable_sources} -ts ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts - COMMAND Qt5::lconvert -drop-translations -o ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf -i ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts + COMMAND Qt6::lupdate -no-obsolete -I ${PROJECT_SOURCE_DIR}/src -locations relative ${CMAKE_CURRENT_SOURCE_DIR}/bitcoinstrings.cpp ${ui_files} ${qt_translatable_sources} -ts ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts + COMMAND Qt6::lconvert -drop-translations -o ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf -i ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts COMMAND ${SED_EXECUTABLE} -i.old -e "s|source-language=\"en\" target-language=\"en\"|source-language=\"en\"|" -e "/<\\/target>/d" ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf.old WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 0ee1b359fa9..48496c51355 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -88,7 +88,11 @@ SendCoinsDialog::SendCoinsDialog(const PlatformStyle *_platformStyle, QWidget *p // Coin Control connect(ui->pushButtonCoinControl, &QPushButton::clicked, this, &SendCoinsDialog::coinControlButtonClicked); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) + connect(ui->checkBoxCoinControlChange, &QCheckBox::checkStateChanged, this, &SendCoinsDialog::coinControlChangeChecked); +#else connect(ui->checkBoxCoinControlChange, &QCheckBox::stateChanged, this, &SendCoinsDialog::coinControlChangeChecked); +#endif connect(ui->lineEditCoinControlChange, &QValidatedLineEdit::textEdited, this, &SendCoinsDialog::coinControlChangeEdited); // Coin Control: clipboard actions @@ -183,8 +187,13 @@ void SendCoinsDialog::setModel(WalletModel *_model) #endif connect(ui->customFee, &BitcoinAmountField::valueChanged, this, &SendCoinsDialog::coinControlUpdateLabels); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) + connect(ui->optInRBF, &QCheckBox::checkStateChanged, this, &SendCoinsDialog::updateSmartFeeLabel); + connect(ui->optInRBF, &QCheckBox::checkStateChanged, this, &SendCoinsDialog::coinControlUpdateLabels); +#else connect(ui->optInRBF, &QCheckBox::stateChanged, this, &SendCoinsDialog::updateSmartFeeLabel); connect(ui->optInRBF, &QCheckBox::stateChanged, this, &SendCoinsDialog::coinControlUpdateLabels); +#endif CAmount requiredFee = model->wallet().getRequiredFee(1000); ui->customFee->SetMinValue(requiredFee); if (ui->customFee->value() < requiredFee) { @@ -944,7 +953,11 @@ void SendCoinsDialog::coinControlButtonClicked() } // Coin Control: checkbox custom change address +#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) +void SendCoinsDialog::coinControlChangeChecked(Qt::CheckState state) +#else void SendCoinsDialog::coinControlChangeChecked(int state) +#endif { if (state == Qt::Unchecked) { diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h index 4e861e55bb3..6ab26df1778 100644 --- a/src/qt/sendcoinsdialog.h +++ b/src/qt/sendcoinsdialog.h @@ -103,7 +103,11 @@ private Q_SLOTS: void refreshBalance(); void coinControlFeatureChanged(bool); void coinControlButtonClicked(); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) + void coinControlChangeChecked(Qt::CheckState); +#else void coinControlChangeChecked(int); +#endif void coinControlChangeEdited(const QString &); void coinControlUpdateLabels(); void coinControlClipboardQuantity(); diff --git a/src/qt/test/CMakeLists.txt b/src/qt/test/CMakeLists.txt index 3acdfeade34..cbfb144596b 100644 --- a/src/qt/test/CMakeLists.txt +++ b/src/qt/test/CMakeLists.txt @@ -20,7 +20,7 @@ target_link_libraries(test_bitcoin-qt test_util bitcoin_node Boost::headers - Qt5::Test + Qt6::Test ) import_plugins(test_bitcoin-qt)