From 990be92541e82e7bace2c6f31bcdd39342735279 Mon Sep 17 00:00:00 2001 From: Oleg Shparber Date: Sun, 2 Oct 2022 15:04:33 -0400 Subject: [PATCH] feat: add Qt 6 support (#1420) --- .github/workflows/build-check.yml | 45 ++++++++++++------- CMakeLists.txt | 8 +++- assets/freedesktop/CMakeLists.txt | 11 ++++- src/app/CMakeLists.txt | 13 +++--- src/app/main.cpp | 19 +++++--- src/libs/browser/CMakeLists.txt | 4 +- src/libs/browser/webview.cpp | 29 ++++++++++-- src/libs/core/CMakeLists.txt | 12 ++++- src/libs/core/settings.cpp | 7 ++- src/libs/registry/CMakeLists.txt | 4 +- src/libs/registry/docset.cpp | 2 +- src/libs/registry/docsetregistry.cpp | 5 ++- src/libs/registry/docsetregistry.h | 2 +- src/libs/registry/listmodel.cpp | 6 ++- src/libs/sidebar/CMakeLists.txt | 4 +- src/libs/ui/CMakeLists.txt | 4 +- src/libs/ui/docsetsdialog.cpp | 6 +-- src/libs/ui/mainwindow.cpp | 4 +- src/libs/ui/qxtglobalshortcut/CMakeLists.txt | 12 +++-- .../qxtglobalshortcut/qxtglobalshortcut.cpp | 16 ++++--- .../qxtglobalshortcut_mac.cpp | 2 +- .../qxtglobalshortcut/qxtglobalshortcut_p.h | 8 +++- .../qxtglobalshortcut_win.cpp | 2 +- .../qxtglobalshortcut_x11.cpp | 7 ++- src/libs/ui/settingsdialog.cpp | 3 +- src/libs/ui/settingsdialog.h | 4 +- src/libs/ui/settingsdialog.ui | 7 ++- src/libs/ui/widgets/CMakeLists.txt | 4 +- src/libs/util/CMakeLists.txt | 4 +- src/libs/util/sqlitedatabase.cpp | 2 +- 30 files changed, 176 insertions(+), 80 deletions(-) diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 7c9a38f8f..302f78381 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -63,18 +63,36 @@ jobs: matrix: config: - { - name: "Windows Server 2019", + name: "Windows Server 2019 / Qt 5", os: windows-2019, - qt_version: '5.15.0', + qt_modules: "qtwebengine", + qt_version: "5.15.0", configurePreset: "ninja-multi-vcpkg", buildPreset: "ninja-multi-vcpkg-release" } - { - name: "Windows Server 2019, Portable", + name: "Windows Server 2019 / Qt 5 / Portable", os: windows-2019, - qt_version: '5.15.0', - configurePreset: "ninja-multi-vcpkg-portable", - buildPreset: "ninja-multi-vcpkg-portable-release" + qt_modules: "qtwebengine", + qt_version: "5.15.0", + configurePreset: ninja-multi-vcpkg-portable, + buildPreset: ninja-multi-vcpkg-portable-release + } + - { + name: "Windows Server 2022 / Qt 6", + os: windows-2022, + qt_modules: "qtwebengine qtwebchannel qtpositioning", + qt_version: "6.3.1", + configurePreset: ninja-multi-vcpkg, + buildPreset: ninja-multi-vcpkg-release + } + - { + name: "Windows Server 2022 / Qt 6 / Portable", + os: windows-2022, + qt_modules: "qtwebengine qtwebchannel qtpositioning", + qt_version: "6.3.1", + configurePreset: ninja-multi-vcpkg-portable, + buildPreset: ninja-multi-vcpkg-portable-release } env: @@ -92,21 +110,14 @@ jobs: vcpkgDirectory: ${{ runner.workspace }}/vcpkg vcpkgGitCommitId: cef0b3ec767df6e83806899fe9525f6cf8d7bc91 # 2022.06.16.1 - - name: Cache Qt - id: cache-qt - uses: actions/cache@v3 - with: - path: ${{ runner.workspace }}/Qt/ - key: ${{ runner.os }}-qt-${{ matrix.config.qt_version }} - - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: arch: win64_msvc2019_64 - modules: qtwebengine - cached: ${{ steps.cache-qt.outputs.cache-hit }} - extra: --external 7z + modules: ${{ matrix.config.qt_modules }} version: ${{ matrix.config.qt_version }} + cache: true + extra: --external 7z - name: Print Environment run: gci env:* | sort-object name diff --git a/CMakeLists.txt b/CMakeLists.txt index 74b181876..ffa5605ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,13 @@ set(PROJECT_COPYRIGHT "© 2013-2020 Oleg Shparber and other contributors") set(PROJECT_DESCRIPTION "A simple documentation browser.") set(PROJECT_URL "https://zealdocs.org") -set(QT_MINIMUM_VERSION 5.9.5) +# Find available major Qt version. It will be stored in QT_VERSION_MAJOR. +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) +if(QT_VERSION_MAJOR EQUAL 6) + set(QT_MINIMUM_VERSION 6.2.0) +else() + set(QT_MINIMUM_VERSION 5.9.5) +endif() # Determine version for dev builds. if(NOT RELEASE_VERSION) diff --git a/assets/freedesktop/CMakeLists.txt b/assets/freedesktop/CMakeLists.txt index bccccc9b4..870438094 100644 --- a/assets/freedesktop/CMakeLists.txt +++ b/assets/freedesktop/CMakeLists.txt @@ -2,7 +2,16 @@ if(UNIX AND NOT APPLE) find_package(ECM 1.0.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(ECMInstallIcons) - include(KDEInstallDirs) + + if(QT_VERSION_MAJOR EQUAL 5) + include(KDEInstallDirs) + else() + # Workaround until KDEInstallDirs6 is ready to use. + include(GNUInstallDirs) + set(KDE_INSTALL_APPDIR "${CMAKE_INSTALL_DATAROOTDIR}/applications") + set(KDE_INSTALL_ICONDIR "${CMAKE_INSTALL_DATAROOTDIR}/icons") + set(KDE_INSTALL_METAINFODIR "${CMAKE_INSTALL_DATAROOTDIR}/metainfo") + endif() ecm_install_icons(ICONS "16-apps-zeal.png" "24-apps-zeal.png" diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 096033c5f..f95b503ee 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -15,12 +15,12 @@ add_executable(App WIN32 target_link_libraries(App Core Util) -find_package(Qt5 COMPONENTS Widgets REQUIRED) -if (Qt5Widgets_VERSION VERSION_LESS QT_MINIMUM_VERSION) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED) +if (Qt${QT_VERSION_MAJOR}Widgets_VERSION VERSION_LESS QT_MINIMUM_VERSION) message(FATAL_ERROR "Qt version >= ${QT_MINIMUM_VERSION} is required.") endif() -target_link_libraries(App Qt5::Widgets) +target_link_libraries(App Qt${QT_VERSION_MAJOR}::Widgets) set_target_properties(App PROPERTIES OUTPUT_NAME ${PROJECT_OUTPUT_NAME} @@ -40,11 +40,8 @@ if(APPLE) RESOURCE "resources/zeal.icns" ) elseif(UNIX) - find_package(ECM REQUIRED NO_MODULE) - set(CMAKE_MODULE_PATH ${ECM_KDE_MODULE_DIR}) - include(KDEInstallDirs) - - install(TARGETS App DESTINATION ${KDE_INSTALL_BINDIR}) + include(GNUInstallDirs) + install(TARGETS App DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() # diff --git a/src/app/main.cpp b/src/app/main.cpp index db9b05be7..d42e4e10a 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -59,12 +59,17 @@ struct CommandLineParameters QString stripParameterUrl(const QString &url, const QString &scheme) { - QStringRef ref = url.midRef(scheme.length() + 1); - if (ref.startsWith(QLatin1String("//"))) - ref = ref.mid(2); - if (ref.endsWith(QLatin1Char('/'))) - ref = ref.left(ref.length() - 1); - return ref.toString(); + QString str = url.mid(scheme.length() + 1); + + if (str.startsWith(QLatin1String("//"))) { + str = str.mid(2); + } + + if (str.endsWith(QLatin1Char('/'))) { + str = str.left(str.length() - 1); + } + + return str; } CommandLineParameters parseCommandLine(const QStringList &arguments) @@ -179,8 +184,10 @@ int main(int argc, char *argv[]) QCoreApplication::setOrganizationDomain(QStringLiteral("zealdocs.org")); QCoreApplication::setOrganizationName(QStringLiteral("Zeal")); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); +#endif QScopedPointer qapp(new QApplication(argc, argv)); diff --git a/src/libs/browser/CMakeLists.txt b/src/libs/browser/CMakeLists.txt index 4d94acc8a..d0abfaba7 100644 --- a/src/libs/browser/CMakeLists.txt +++ b/src/libs/browser/CMakeLists.txt @@ -10,5 +10,5 @@ add_library(Browser STATIC target_link_libraries(Browser) -find_package(Qt5 COMPONENTS WebEngineWidgets WebChannel REQUIRED) -target_link_libraries(Browser Qt5::WebEngineWidgets Qt5::WebChannel) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS WebChannel WebEngineWidgets REQUIRED) +target_link_libraries(Browser Qt${QT_VERSION_MAJOR}::WebChannel Qt${QT_VERSION_MAJOR}::WebEngineWidgets) diff --git a/src/libs/browser/webview.cpp b/src/libs/browser/webview.cpp index 6d8107044..45f83b015 100644 --- a/src/libs/browser/webview.cpp +++ b/src/libs/browser/webview.cpp @@ -38,11 +38,16 @@ #include #include #include -#include #include #include #include +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) +#include +#else +#include +#endif + using namespace Zeal::Browser; WebView::WebView(QWidget *parent) @@ -116,13 +121,20 @@ QWebEngineView *WebView::createWindow(QWebEnginePage::WebWindowType type) void WebView::contextMenuEvent(QContextMenuEvent *event) { - QWebEnginePage *p = page(); - const QWebEngineContextMenuData& contextData = p->contextMenuData(); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) + const QWebEngineContextMenuData& contextData = page()->contextMenuData(); if (!contextData.isValid()) { QWebEngineView::contextMenuEvent(event); return; } +#else + QWebEngineContextMenuRequest *contextMenuRequest = lastContextMenuRequest(); + if (contextMenuRequest == nullptr) { + QWebEngineView::contextMenuEvent(event); + return; + } +#endif event->accept(); @@ -132,7 +144,12 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) m_contextMenu = new QMenu(this); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) QUrl linkUrl = contextData.linkUrl(); +#else + QUrl linkUrl = contextMenuRequest->linkUrl(); +#endif + if (linkUrl.isValid()) { const QString scheme = linkUrl.scheme(); @@ -153,7 +170,13 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) } } + +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) const QString selectedText = contextData.selectedText(); +#else + const QString selectedText = contextMenuRequest->selectedText(); +#endif + if (!selectedText.isEmpty()) { if (!m_contextMenu->isEmpty()) { m_contextMenu->addSeparator(); diff --git a/src/libs/core/CMakeLists.txt b/src/libs/core/CMakeLists.txt index 37627b039..f416a66a3 100644 --- a/src/libs/core/CMakeLists.txt +++ b/src/libs/core/CMakeLists.txt @@ -16,8 +16,16 @@ add_definitions(-DCPPHTTPLIB_USE_POLL) target_link_libraries(Core Registry Ui) -find_package(Qt5 COMPONENTS Network WebEngine Widgets REQUIRED) -target_link_libraries(Core Qt5::Network Qt5::WebEngine Qt5::Widgets) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Network WebEngineCore Widgets REQUIRED) +target_link_libraries(Core Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::WebEngineCore Qt${QT_VERSION_MAJOR}::Widgets) + +if(QT_VERSION_MAJOR EQUAL 6) + find_package(Qt6 COMPONENTS WebEngineCore Widgets REQUIRED) + target_link_libraries(Core Qt6::WebEngineCore) +else() + find_package(Qt5 COMPONENTS WebEngine Widgets REQUIRED) + target_link_libraries(Core Qt5::WebEngine) +endif() find_package(LibArchive REQUIRED) diff --git a/src/libs/core/settings.cpp b/src/libs/core/settings.cpp index d073aac8e..0cd757b17 100644 --- a/src/libs/core/settings.cpp +++ b/src/libs/core/settings.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include namespace { @@ -50,7 +51,9 @@ using namespace Zeal::Core; Settings::Settings(QObject *parent) : QObject(parent) { +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) qRegisterMetaTypeStreamOperators("ExternalLinkPolicy"); +#endif load(); } @@ -87,7 +90,7 @@ void Settings::load() settings->beginGroup(GroupContent); // Fonts - QWebEngineSettings *webSettings = QWebEngineSettings::defaultSettings(); + QWebEngineSettings *webSettings = QWebEngineProfile::defaultProfile()->settings(); serifFontFamily = settings->value(QStringLiteral("serif_font_family"), webSettings->fontFamily(QWebEngineSettings::SerifFont)).toString(); sansSerifFontFamily = settings->value(QStringLiteral("sans_serif_font_family"), @@ -150,7 +153,7 @@ void Settings::load() docsetPath = settings->value(QStringLiteral("path")).toString(); } else { #ifndef PORTABLE_BUILD - docsetPath = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + docsetPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + QLatin1String("/docsets"); #else docsetPath = QStringLiteral("docsets"); diff --git a/src/libs/registry/CMakeLists.txt b/src/libs/registry/CMakeLists.txt index 130570c4d..2fbaba4c7 100644 --- a/src/libs/registry/CMakeLists.txt +++ b/src/libs/registry/CMakeLists.txt @@ -12,5 +12,5 @@ add_library(Registry STATIC searchresult.h ) -find_package(Qt5 COMPONENTS Concurrent Gui Network REQUIRED) -target_link_libraries(Registry Util Qt5::Concurrent Qt5::Gui Qt5::Network) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Concurrent Gui Network REQUIRED) +target_link_libraries(Registry Util Qt${QT_VERSION_MAJOR}::Concurrent Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Network) diff --git a/src/libs/registry/docset.cpp b/src/libs/registry/docset.cpp index a6a60f796..ac4d30c2b 100644 --- a/src/libs/registry/docset.cpp +++ b/src/libs/registry/docset.cpp @@ -523,7 +523,7 @@ void Docset::createIndex() m_db->execute(indexDropQuery.arg(oldIndexName)); } - m_db->execute(indexCreateQuery.arg(IndexNamePrefix, IndexNameVersion, tableName, columnName)); + m_db->execute(indexCreateQuery.arg(IndexNamePrefix).arg(IndexNameVersion).arg(tableName).arg(columnName)); } void Docset::createView() diff --git a/src/libs/registry/docsetregistry.cpp b/src/libs/registry/docsetregistry.cpp index 594c5d9cf..92490e38b 100644 --- a/src/libs/registry/docsetregistry.cpp +++ b/src/libs/registry/docsetregistry.cpp @@ -185,7 +185,10 @@ Docset *DocsetRegistry::docset(int index) const { if (index < 0 || index >= m_docsets.size()) return nullptr; - return (m_docsets.cbegin() + index).value(); + + auto it = m_docsets.cbegin(); + std::advance(it, index); + return *it; } Docset *DocsetRegistry::docsetForUrl(const QUrl &url) diff --git a/src/libs/registry/docsetregistry.h b/src/libs/registry/docsetregistry.h index 90c58b270..df7122e2e 100644 --- a/src/libs/registry/docsetregistry.h +++ b/src/libs/registry/docsetregistry.h @@ -25,6 +25,7 @@ #define ZEAL_REGISTRY_DOCSETREGISTRY_H #include "cancellationtoken.h" +#include "searchresult.h" #include #include @@ -36,7 +37,6 @@ namespace Zeal { namespace Registry { class Docset; -struct SearchResult; class DocsetRegistry final : public QObject { diff --git a/src/libs/registry/listmodel.cpp b/src/libs/registry/listmodel.cpp index ff72edbac..d24a8d1ab 100644 --- a/src/libs/registry/listmodel.cpp +++ b/src/libs/registry/listmodel.cpp @@ -81,7 +81,8 @@ QVariant ListModel::data(const QModelIndex &index, int role) const } case Level::SymbolLevel: { auto groupItem = static_cast(index.internalPointer()); - auto it = groupItem->docsetItem->docset->symbols(groupItem->symbolType).cbegin() + index.row(); + auto it = groupItem->docsetItem->docset->symbols(groupItem->symbolType).cbegin(); + std::advance(it, index.row()); return it.key(); } default: @@ -102,7 +103,8 @@ QVariant ListModel::data(const QModelIndex &index, int role) const return itemInRow(index.row())->docset->indexFileUrl(); case Level::SymbolLevel: { auto groupItem = static_cast(index.internalPointer()); - auto it = groupItem->docsetItem->docset->symbols(groupItem->symbolType).cbegin() + index.row(); + auto it = groupItem->docsetItem->docset->symbols(groupItem->symbolType).cbegin(); + std::advance(it, index.row()); return it.value(); } default: diff --git a/src/libs/sidebar/CMakeLists.txt b/src/libs/sidebar/CMakeLists.txt index dc6be0e27..133c9d9bd 100644 --- a/src/libs/sidebar/CMakeLists.txt +++ b/src/libs/sidebar/CMakeLists.txt @@ -7,5 +7,5 @@ add_library(Sidebar STATIC target_link_libraries(Sidebar) -find_package(Qt5 COMPONENTS Widgets REQUIRED) -target_link_libraries(Sidebar Qt5::Widgets) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED) +target_link_libraries(Sidebar Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/src/libs/ui/CMakeLists.txt b/src/libs/ui/CMakeLists.txt index ecd1ce395..2937c5a88 100644 --- a/src/libs/ui/CMakeLists.txt +++ b/src/libs/ui/CMakeLists.txt @@ -23,5 +23,5 @@ add_library(Ui STATIC target_link_libraries(Ui Browser Sidebar QxtGlobalShortcut Widgets Registry) -find_package(Qt5 COMPONENTS WebEngineWidgets REQUIRED) -target_link_libraries(Ui Qt5::WebEngineWidgets) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS WebEngineWidgets REQUIRED) +target_link_libraries(Ui Qt${QT_VERSION_MAJOR}::WebEngineWidgets) diff --git a/src/libs/ui/docsetsdialog.cpp b/src/libs/ui/docsetsdialog.cpp index 2f0ce088f..e55098658 100644 --- a/src/libs/ui/docsetsdialog.cpp +++ b/src/libs/ui/docsetsdialog.cpp @@ -258,9 +258,7 @@ void DocsetsDialog::downloadCompleted() const QString msg = tr("Download failed!

Error: %1
URL: %2") .arg(reply->errorString(), reply->request().url().toString()); const int ret = QMessageBox::warning(this, QStringLiteral("Zeal"), msg, - QMessageBox::Retry | QMessageBox::Default, - QMessageBox::Cancel | QMessageBox::Escape, - QMessageBox::NoButton); + QMessageBox::Retry | QMessageBox::Cancel); if (ret == QMessageBox::Retry) { QNetworkReply *newReply = download(reply->request().url()); @@ -772,7 +770,7 @@ void DocsetsDialog::downloadDashDocset(const QModelIndex &index) QUrl url; if (!m_userFeeds.contains(name)) { // No feed present means that this is a Kapeli docset - QString urlString = QString(RedirectServerUrl).arg("com.kapeli", name); + QString urlString = QString(RedirectServerUrl).arg("com.kapeli").arg(name); url = QUrl(urlString); } else { url = m_userFeeds[name].url(); diff --git a/src/libs/ui/mainwindow.cpp b/src/libs/ui/mainwindow.cpp index f4daf0f96..ddca33a97 100644 --- a/src/libs/ui/mainwindow.cpp +++ b/src/libs/ui/mainwindow.cpp @@ -173,8 +173,8 @@ MainWindow::MainWindow(Core::Application *app, QWidget *parent) const int ret = QMessageBox::information(this, QStringLiteral("Zeal"), tr("Zeal %1 is available. Open download page?").arg(version), - QMessageBox::Yes | QMessageBox::Default, - QMessageBox::No | QMessageBox::Escape); + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes); qApp->setQuitOnLastWindowClosed(true); if (ret == QMessageBox::Yes) { diff --git a/src/libs/ui/qxtglobalshortcut/CMakeLists.txt b/src/libs/ui/qxtglobalshortcut/CMakeLists.txt index 177683982..f1c6a0515 100644 --- a/src/libs/ui/qxtglobalshortcut/CMakeLists.txt +++ b/src/libs/ui/qxtglobalshortcut/CMakeLists.txt @@ -21,8 +21,8 @@ endif() add_library(QxtGlobalShortcut STATIC ${QxtGlobalShortcut_SOURCES}) -find_package(Qt5Gui REQUIRED) -target_link_libraries(QxtGlobalShortcut Qt5::Gui) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Gui REQUIRED) +target_link_libraries(QxtGlobalShortcut Qt${QT_VERSION_MAJOR}::Gui) if(APPLE) find_library(CARBON_LIBRARY Carbon) @@ -30,8 +30,12 @@ if(APPLE) elseif(UNIX AND X11_FOUND) target_link_libraries(QxtGlobalShortcut ${X11_LIBRARIES}) - find_package(Qt5 COMPONENTS X11Extras REQUIRED) - target_link_libraries(QxtGlobalShortcut Qt5::X11Extras) + if(QT_VERSION_MAJOR EQUAL 5) + find_package(Qt5 COMPONENTS X11Extras REQUIRED) + target_link_libraries(QxtGlobalShortcut Qt5::X11Extras) + else() + target_link_libraries(QxtGlobalShortcut Qt${QT_VERSION_MAJOR}::GuiPrivate) + endif() find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_FIND_MODULE_DIR}) diff --git a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut.cpp b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut.cpp index e2d9a2847..d7723a57d 100644 --- a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut.cpp +++ b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut.cpp @@ -88,16 +88,22 @@ QxtGlobalShortcutPrivate::~QxtGlobalShortcutPrivate() bool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence &shortcut) { Q_Q(QxtGlobalShortcut); - Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier; - key = shortcut.isEmpty() ? Qt::Key(0) : Qt::Key((shortcut[0] ^ allMods) & shortcut[0]); - mods = shortcut.isEmpty() ? Qt::KeyboardModifiers(Qt::NoModifier) : Qt::KeyboardModifiers(shortcut[0] & allMods); + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + const int combination = shortcut[0]; +#else + const int combination = shortcut[0].toCombined(); +#endif + + key = shortcut.isEmpty() ? Qt::Key(0) : Qt::Key(combination & ~Qt::KeyboardModifierMask); + mods = shortcut.isEmpty() ? Qt::NoModifier : Qt::KeyboardModifiers(combination & Qt::KeyboardModifierMask); const quint32 nativeKey = nativeKeycode(key); const quint32 nativeMods = nativeModifiers(mods); const bool res = registerShortcut(nativeKey, nativeMods); if (res) shortcuts.insert({nativeKey, nativeMods}, q); else - qWarning("QxtGlobalShortcut failed to register: %s", qPrintable(QKeySequence(key + mods).toString())); + qWarning("QxtGlobalShortcut failed to register: %s", qPrintable(QKeySequence(key | mods).toString())); return res; } @@ -115,7 +121,7 @@ bool QxtGlobalShortcutPrivate::unsetShortcut() if (res) shortcuts.remove({nativeKey, nativeMods}); else - qWarning("QxtGlobalShortcut failed to unregister: %s", qPrintable(QKeySequence(key + mods).toString())); + qWarning("QxtGlobalShortcut failed to unregister: %s", qPrintable(QKeySequence(key | mods).toString())); key = Qt::Key(0); mods = Qt::KeyboardModifiers(Qt::NoModifier); diff --git a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_mac.cpp b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_mac.cpp index 40258be40..98d4f7978 100644 --- a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_mac.cpp +++ b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_mac.cpp @@ -78,7 +78,7 @@ OSStatus qxt_mac_handle_hot_key(EventHandlerCallRef nextHandler, EventRef event, } bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray &eventType, - void *message, long *result) + void *message, NativeEventFilterResult *result) { Q_UNUSED(eventType) Q_UNUSED(message) diff --git a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_p.h b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_p.h index 35e088519..e904402ff 100644 --- a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_p.h +++ b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_p.h @@ -56,6 +56,12 @@ #include #include +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) +#define NativeEventFilterResult long +#else +#define NativeEventFilterResult qintptr +#endif + class QKeySequence; class QxtGlobalShortcut; @@ -79,7 +85,7 @@ class QxtGlobalShortcutPrivate : public QAbstractNativeEventFilter bool setShortcut(const QKeySequence &shortcut); bool unsetShortcut(); - bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; + bool nativeEventFilter(const QByteArray &eventType, void *message, NativeEventFilterResult *result) override; static bool activateShortcut(quint32 nativeKey, quint32 nativeMods); diff --git a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_win.cpp b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_win.cpp index 8d7408177..db21da075 100644 --- a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_win.cpp +++ b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_win.cpp @@ -55,7 +55,7 @@ #include bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray &eventType, - void *message, long *result) + void *message, NativeEventFilterResult *result) { Q_UNUSED(eventType) Q_UNUSED(result) diff --git a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_x11.cpp b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_x11.cpp index 3fe6c7ce8..d97c661f1 100644 --- a/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_x11.cpp +++ b/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_x11.cpp @@ -55,7 +55,12 @@ #include #include #include + +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) #include +#else +#include +#endif #include #include @@ -68,7 +73,7 @@ constexpr quint32 maskModifiers[] = { } // namespace bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray &eventType, - void *message, long *result) + void *message, NativeEventFilterResult *result) { Q_UNUSED(result) if (eventType != "xcb_generic_event_t") diff --git a/src/libs/ui/settingsdialog.cpp b/src/libs/ui/settingsdialog.cpp index dde38caf6..fca9f6a2e 100644 --- a/src/libs/ui/settingsdialog.cpp +++ b/src/libs/ui/settingsdialog.cpp @@ -31,6 +31,7 @@ #include #include +#include #include using namespace Zeal; @@ -80,7 +81,7 @@ SettingsDialog::SettingsDialog(QWidget *parent) // Disable global shortcut settings if not supported. ui->globalHotKeyGroupBox->setEnabled(QxtGlobalShortcut::isSupported()); - QWebEngineSettings *webSettings = QWebEngineSettings::defaultSettings(); + QWebEngineSettings *webSettings = QWebEngineProfile::defaultProfile()->settings(); // Avoid casting in each connect. auto currentIndexChangedSignal diff --git a/src/libs/ui/settingsdialog.h b/src/libs/ui/settingsdialog.h index 1a6c0bd00..7009f7fd0 100644 --- a/src/libs/ui/settingsdialog.h +++ b/src/libs/ui/settingsdialog.h @@ -40,7 +40,7 @@ class SettingsDialog : public QDialog explicit SettingsDialog(QWidget *parent = nullptr); ~SettingsDialog() override; -private slots: +public slots: void chooseCustomCssFile(); void chooseDocsetStoragePath(); @@ -50,6 +50,8 @@ private slots: private: Ui::SettingsDialog *ui = nullptr; + + friend class Ui::SettingsDialog; }; } // namespace WidgetUi diff --git a/src/libs/ui/settingsdialog.ui b/src/libs/ui/settingsdialog.ui index e0406fad1..175bc02bf 100644 --- a/src/libs/ui/settingsdialog.ui +++ b/src/libs/ui/settingsdialog.ui @@ -1,7 +1,7 @@ Zeal::WidgetUi::SettingsDialog - + Qt::ApplicationModal @@ -736,6 +736,11 @@ QLineEdit
ui/widgets/shortcutedit.h
+ + SettingsDialog + QDialog +
ui/settingsdialog.h
+
diff --git a/src/libs/ui/widgets/CMakeLists.txt b/src/libs/ui/widgets/CMakeLists.txt index e29d288f6..09d12dd0b 100644 --- a/src/libs/ui/widgets/CMakeLists.txt +++ b/src/libs/ui/widgets/CMakeLists.txt @@ -5,5 +5,5 @@ add_library(Widgets STATIC toolbarframe.cpp ) -find_package(Qt5 COMPONENTS Widgets REQUIRED) -target_link_libraries(Widgets Qt5::Widgets) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED) +target_link_libraries(Widgets Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/src/libs/util/CMakeLists.txt b/src/libs/util/CMakeLists.txt index a176606e2..0f5f01c31 100644 --- a/src/libs/util/CMakeLists.txt +++ b/src/libs/util/CMakeLists.txt @@ -9,8 +9,8 @@ add_library(Util STATIC caseinsensitivemap.h ) -find_package(Qt5Core REQUIRED) -target_link_libraries(Util Qt5::Core) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) +target_link_libraries(Util Qt${QT_VERSION_MAJOR}::Core) find_package(SQLite REQUIRED) include_directories(${SQLite_INCLUDE_DIR}) diff --git a/src/libs/util/sqlitedatabase.cpp b/src/libs/util/sqlitedatabase.cpp index 4002692bd..3c83a7d47 100644 --- a/src/libs/util/sqlitedatabase.cpp +++ b/src/libs/util/sqlitedatabase.cpp @@ -218,7 +218,7 @@ QVariant SQLiteDatabase::value(int index) const ret = sqlite3_column_int64(m_stmt, index); break; case SQLITE_NULL: - ret = QVariant(QVariant::String); + ret = QVariant(); break; default: ret = QString(static_cast(sqlite3_column_text16(m_stmt, index)),