1

Тема: Класи Qt та часткове зникнення їхніх методів

Створюю екземпляр класу QTextToSpeech за допомогою QPointer.
Усе працює начебто добре, жодних помилок.
Але коли намагаюся використати метод findVoices(), Qt Creator просто не бачить його.
І це не помилка написання, навіть в переліку підказок його немає, є лише findChild(), findChildren().
У мене в налаштуваннях CMakeLists задано сумісність Qt6 і Qt5,
я вирішив лишити лише Qt6 і findVoices() знову з'явився.
Але при цьому зникла підтримка qt_add_translations, метода defaultSettings з QWebEngineView
і <QActionGroup> почало вимагати окремого #include.
Що це таке? Чому Qt «обрізає» деякі методи класів у режимі сумісності різних версій? Що зробити, щоб усе працювало як слід?

Ось CMakeLists (більшість — це автоматичні налаштування створені Qt Creator):

cmake_minimum_required(VERSION 3.5)

project(Movar_cpp VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR}
    REQUIRED COMPONENTS Widgets LinguistTools WebEngineWidgets TextToSpeech)

set(TS_FILES
    i18n/Movar_cpp_uk_UA.ts
    i18n/Movar_cpp_en_US.ts
    i18n/Movar_cpp_ja_JP.ts
)

set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        ${TS_FILES}
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(Movar_cpp
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET Movar_cpp APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation

    #qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
    qt_add_translations(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})

else()
    if(ANDROID)
        add_library(Movar_cpp SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(Movar_cpp
            ${PROJECT_SOURCES}
            dictionarysettings.h dictionarysettings.cpp dictionarysettings.ui
            fileloader.h fileloader.cpp
            app_resources.qrc

        )
    endif()

    #qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
endif()

add_custom_target(translations DEPENDS ${QM_FILES})
add_dependencies(${CMAKE_PROJECT_NAME} translations)

target_link_libraries(Movar_cpp PRIVATE
    Qt${QT_VERSION_MAJOR}::Widgets
    Qt${QT_VERSION_MAJOR}::WebEngineWidgets
    Qt${QT_VERSION_MAJOR}::TextToSpeech
    )

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.Movar_cpp)
endif()
set_target_properties(Movar_cpp PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS Movar_cpp
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(Movar_cpp)
endif()

2

Re: Класи Qt та часткове зникнення їхніх методів

Щодо defaultSettings це метод з QWebEngineSettings, а не QWebEngineView.
У будь-якому разі, його легко можна замінити на QWebEngineView::settings(),
повертає те саме, тільки в цьому випадку потрібно через екземпляр класу викликати,
бо метод не статичний.
А ще прив'язка лише до Qt6 викликає погіршення відображення віджетів,
у частині віджетів тло стає сірим і постійно перемальовується при русі вікна(то сіре, то чорне).

3

Re: Класи Qt та часткове зникнення їхніх методів

Щоб отримати той же результат, що і з findVoices(),
треба перед використанням availableVoices() завантажувати потрібну мову(setLocale()) до екземляра класу QTextToSpeech.

4

Re: Класи Qt та часткове зникнення їхніх методів

Не профі в Qt.
Та не розумію навіщо поєднувати різні версії. Схоже в цьому і криється проблема.

5

Re: Класи Qt та часткове зникнення їхніх методів

Droid 77 написав:

Не профі в Qt.
Та не розумію навіщо поєднувати різні версії. Схоже в цьому і криється проблема.

Так, схожі проблеми я бачив і в попередніх версіях Qt.
Просто в мене стоїть Qt5, яке вимагається іншими програмами.
Qt Creator це бачить і автоматично створює CMakeLіsts під сумісність Qt6 і Qt5.
Хоча здебільшого сумісність працює добре.
Проблеми лише з додатковими нерідними бібліотеками на зразок QTextToSpeech чи QWebEngineView.

6

Re: Класи Qt та часткове зникнення їхніх методів

Коли вони вже Qщось-там-є
То вони вже майже рідні. Тре дивитися в яких версіях збиралося те щось-там. І не намагатися підсунути під іншу версію.
Або підсовувати та ретельно вивчати чи підходить..

Подякували: leofun011

7 Востаннє редагувалося Droid 77 (09.12.2023 00:35:08)

Re: Класи Qt та часткове зникнення їхніх методів

Метафора:
Те що Ви робите схоже на намагання змусити iostream працювати з рядками без string.

8

Re: Класи Qt та часткове зникнення їхніх методів

Vitaliy_Danmer написав:

Проблеми лише з додатковими нерідними бібліотеками на зразок QTextToSpeech чи QWebEngineView.

Якщо назва класу починається з Q , то варто очікувати що це клас із бібліотеки самого Qt.

Ці класи є частиною Qt5 і Qt6. Реалізації можуть бути не однакові.