Skip to content

Commit

Permalink
feat: Add Qt 6 support (#209)
Browse files Browse the repository at this point in the history
* qt6: webengine(quick) module no longer required

Relevant componets were moved to webenginecore

* qt6: QWebEngineDownloadRequest

QWebEngineDownloadItem was renamed to QWebEngineDownloadRequest and the downloadProgress signal was split into receivedBytesChanged and totalBytesChanged signals

* qt6: QWebEnginePage::view() polyfill

QWebEnginePage was moved to the webenginecore module in Qt6. As such, it cannot reference QWidget from the widgets module. QWebEnginePage::view() was replaced by QWebEngineView::forPage() from the webenginewidgets module.

* qt6: QWebEnginePage::certificateError() is now a signal

QWebEnginePage::certificateError() was changed from an overridable method to a signal in Qt6. The response actions are now methods on the QWebEngineCertificateError object. For some reason, said object is passed as const reference and must be const_cast before applying a resolution.

* qt6: QWebEngineContextMenuRequest

QWebEngineContextMenuData was renamed to QWebEngineContextMenuRequest in Qt6. The related methods were moved from QWebEnginePage (which moved to the webenginecore module) to QWebEngineView.

* qt6: QWebEngineSettings::defaultSettings() removal

QWebEngineSettings::defaultSettings() was removed in Qt6, use QWebEngineProfile::defaultProfile()->settings() insteadd.

* qt6: QStandardPaths::DataLocation removal

QStandardPaths::DataLocation was already deprecated in Qt5 and removed in Qt6. It was an alias for QStandardPaths::AppLocalDataLocation.

* qt6: QDesktopWidget removal

QDesktopWidget (and QApplication::desktop()) was removed in Qt6

* qt6: Use QString::fromUtf8() instead of QTextCodec

QTextCodec was removed (movec to core5compat) in Qt6.

* qt6: QGeoPositionInfoSource::updateTimeout removal

The QGeoPositionInfoSource::updateTimeout signal was removed in Qt6, with it's functionality taken over by the QGeoPositionInfoSource::errorOccured signal.

* qt6: QDateTime::toTime_t() removal

QDateTime::toTime_t() was already deprecated and replaced with QDateTime::toSecsSinceEpoch() in Qt5. It was removed in Qt6.

* qt6: Fix some deprecation warnings
  • Loading branch information
Orochimarufan authored Nov 1, 2024
1 parent ece2c55 commit 2370015
Show file tree
Hide file tree
Showing 14 changed files with 115 additions and 48 deletions.
4 changes: 3 additions & 1 deletion src/WhatsApp.pro
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ equals(QMAKE_HOST.arch, aarch64) {
# Uncomment if you need specific linker flags as well
#QMAKE_LFLAGS += $$QMAKE_LDFLAGS

QT += core gui webengine webenginewidgets positioning
QT += core gui webenginewidgets positioning

lessThan(QT_MAJOR_VERSION, 6): QT += webengine

CONFIG += c++17

Expand Down
8 changes: 6 additions & 2 deletions src/automatictheme.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,11 @@ AutomaticTheme::AutomaticTheme(QWidget *parent)
ui->refresh->setEnabled(false);
}
});
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
connect(m_gPosInfoSrc, &QGeoPositionInfoSource::errorOccurred, this, [=]() {
#else
connect(m_gPosInfoSrc, &QGeoPositionInfoSource::updateTimeout, this, [=]() {
#endif
if (!SettingsManager::instance().settings().value("sunrise").isValid() ||
!SettingsManager::instance().settings().value("sunset").isValid()) {
if (ui->refresh->isEnabled())
Expand Down Expand Up @@ -77,9 +81,9 @@ void AutomaticTheme::on_refresh_clicked() {
if (geoCor.isValid()) {
Sunclock sun(this->m_latitube, this->m_longitude, this->m_hourOffset);
m_sunrise.setSecsSinceEpoch(
sun.sunrise(QDateTime::currentDateTimeUtc().toTime_t()));
sun.sunrise(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()));
m_sunset.setSecsSinceEpoch(
sun.sunset(QDateTime::currentDateTimeUtc().toTime_t()));
sun.sunset(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()));

ui->sunrise->setTime(m_sunrise.time());
ui->sunset->setTime(m_sunset.time());
Expand Down
10 changes: 6 additions & 4 deletions src/downloadmanagerwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,14 @@

#include <QFileDialog>
#include <QStandardPaths>
#include <QWebEngineDownloadItem>
#include <QWidget>

QT_BEGIN_NAMESPACE
class QWebEngineDownloadItem;
QT_END_NAMESPACE
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QWebEngineDownloadRequest>
using QWebEngineDownloadItem = QWebEngineDownloadRequest;
#else
#include <QWebEngineDownloadItem>
#endif

class DownloadWidget;

Expand Down
8 changes: 7 additions & 1 deletion src/downloadwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include <QDesktopServices>
#include <QFileInfo>
#include <QUrl>
#include <QWebEngineDownloadItem>

DownloadWidget::DownloadWidget(QWebEngineDownloadItem *download,
QWidget *parent)
Expand Down Expand Up @@ -38,8 +37,15 @@ DownloadWidget::DownloadWidget(QWebEngineDownloadItem *download,
emit removeClicked(this);
});

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
connect(m_download, &QWebEngineDownloadItem::receivedBytesChanged, this,
&DownloadWidget::updateWidget);
connect(m_download, &QWebEngineDownloadItem::totalBytesChanged, this,
&DownloadWidget::updateWidget);
#else
connect(m_download, &QWebEngineDownloadItem::downloadProgress, this,
&DownloadWidget::updateWidget);
#endif

connect(m_download, &QWebEngineDownloadItem::stateChanged, this,
&DownloadWidget::updateWidget);
Expand Down
9 changes: 6 additions & 3 deletions src/downloadwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,12 @@
#include <QFrame>
#include <QTime>

QT_BEGIN_NAMESPACE
class QWebEngineDownloadItem;
QT_END_NAMESPACE
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QWebEngineDownloadRequest>
using QWebEngineDownloadItem = QWebEngineDownloadRequest;
#else
#include <QWebEngineDownloadItem>
#endif

// Displays one ongoing or finished download (QWebEngineDownloadItem).
class DownloadWidget final : public QFrame, public Ui::DownloadWidget {
Expand Down
21 changes: 13 additions & 8 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@
#include <QDebug>
#include <QWebEngineProfile>
#include <QWebEngineSettings>
#include <QtWebEngine>
#include <QtWidgets>

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QtWebEngineCore>
#else
#include <QtWebEngine>
#endif

#include "common.h"
#include "def.h"
#include "mainwindow.h"
Expand All @@ -13,7 +18,9 @@

int main(int argc, char *argv[]) {

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

#ifdef QT_DEBUG
qputenv("QTWEBENGINE_CHROMIUM_FLAGS",
Expand Down Expand Up @@ -136,12 +143,10 @@ int main(int argc, char *argv[]) {
return 0;
}

QWebEngineSettings::defaultSettings()->setAttribute(
QWebEngineSettings::DnsPrefetchEnabled, true);
QWebEngineSettings::defaultSettings()->setAttribute(
QWebEngineSettings::FullScreenSupportEnabled, true);
QWebEngineSettings::defaultSettings()->setAttribute(
QWebEngineSettings::JavascriptCanAccessClipboard, true);
QWebEngineSettings *websettings = QWebEngineProfile::defaultProfile()->settings();
websettings->setAttribute(QWebEngineSettings::DnsPrefetchEnabled, true);
websettings->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
websettings->setAttribute(QWebEngineSettings::JavascriptCanAccessClipboard, true);

MainWindow whatsie;

Expand All @@ -153,7 +158,7 @@ int main(int argc, char *argv[]) {
qInfo().noquote() << "Another instance with PID: " +
QString::number(instanceId) +
", sent argument: " + message;
QString messageStr = QTextCodec::codecForMib(106)->toUnicode(message);
QString messageStr = QString::fromUtf8(message);

QCommandLineParser p;
p.addOptions(secondaryInstanceCLIOptions);
Expand Down
19 changes: 9 additions & 10 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ void MainWindow::restoreMainWindow() {
SettingsManager::instance().settings().value("geometry").toByteArray());
QPoint pos = QCursor::pos();
auto localScreens = QGuiApplication::screens();
for (auto screen : qAsConst(localScreens)) {
for (auto screen : std::as_const(localScreens)) {
QRect screenRect = screen->geometry();
if (screenRect.contains(pos)) {
this->move(screenRect.center() - this->rect().center());
Expand Down Expand Up @@ -244,7 +244,7 @@ void MainWindow::tryLogOut() {
}

void MainWindow::initSettingWidget() {
int screenNumber = qApp->desktop()->screenNumber(this);
int screenNumber = qApp->screens().indexOf(screen());
if (m_settingsWidget == nullptr) {
m_settingsWidget = new SettingsWidget(
this, screenNumber, m_webEngine->page()->profile()->cachePath(),
Expand Down Expand Up @@ -451,8 +451,7 @@ void MainWindow::showSettings(bool isAskedByCLI) {
if (!m_settingsWidget->isVisible()) {
this->updateSettingsUserAgentWidget();
m_settingsWidget->refresh();
int screenNumber = qApp->desktop()->screenNumber(this);
QRect screenRect = QGuiApplication::screens().at(screenNumber)->geometry();
QRect screenRect = screen()->geometry();
if (!screenRect.contains(m_settingsWidget->pos())) {
m_settingsWidget->move(screenRect.center() -
m_settingsWidget->rect().center());
Expand Down Expand Up @@ -579,7 +578,7 @@ void MainWindow::notificationClicked() {
void MainWindow::createActions() {

m_openUrlAction = new QAction("New Chat", this);
m_openUrlAction->setShortcut(QKeySequence(Qt::Modifier::CTRL + Qt::Key_N));
m_openUrlAction->setShortcut(QKeySequence(Qt::Modifier::CTRL | Qt::Key_N));
connect(m_openUrlAction, &QAction::triggered, this, &MainWindow::newChat);
addAction(m_openUrlAction);

Expand All @@ -594,7 +593,7 @@ void MainWindow::createActions() {
addAction(m_minimizeAction);

QShortcut *minimizeShortcut = new QShortcut(
QKeySequence(Qt::Modifier::CTRL + Qt::Key_W), this, SLOT(hide()));
QKeySequence(Qt::Modifier::CTRL | Qt::Key_W), this, SLOT(hide()));
minimizeShortcut->setAutoRepeat(false);

m_restoreAction = new QAction(tr("&Restore"), this);
Expand All @@ -608,19 +607,19 @@ void MainWindow::createActions() {
addAction(m_reloadAction);

m_lockAction = new QAction(tr("Loc&k"), this);
m_lockAction->setShortcut(QKeySequence(Qt::Modifier::CTRL + Qt::Key_L));
m_lockAction->setShortcut(QKeySequence(Qt::Modifier::CTRL | Qt::Key_L));
connect(m_lockAction, &QAction::triggered, this, &MainWindow::lockApp);
addAction(m_lockAction);

m_settingsAction = new QAction(tr("&Settings"), this);
m_settingsAction->setShortcut(QKeySequence(Qt::Modifier::CTRL + Qt::Key_P));
m_settingsAction->setShortcut(QKeySequence(Qt::Modifier::CTRL | Qt::Key_P));
connect(m_settingsAction, &QAction::triggered, this,
&MainWindow::showSettings);
addAction(m_settingsAction);

m_toggleThemeAction = new QAction(tr("&Toggle theme"), this);
m_toggleThemeAction->setShortcut(
QKeySequence(Qt::Modifier::CTRL + Qt::Key_T));
QKeySequence(Qt::Modifier::CTRL | Qt::Key_T));
connect(m_toggleThemeAction, &QAction::triggered, this,
&MainWindow::toggleTheme);
addAction(m_toggleThemeAction);
Expand All @@ -629,7 +628,7 @@ void MainWindow::createActions() {
connect(m_aboutAction, &QAction::triggered, this, &MainWindow::showAbout);

m_quitAction = new QAction(tr("&Quit"), this);
m_quitAction->setShortcut(QKeySequence(Qt::Modifier::CTRL + Qt::Key_Q));
m_quitAction->setShortcut(QKeySequence(Qt::Modifier::CTRL | Qt::Key_Q));
connect(m_quitAction, &QAction::triggered, this, &MainWindow::quitApp);
addAction(m_quitAction);
}
Expand Down
1 change: 0 additions & 1 deletion src/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#include <QStyle>
#include <QStyleFactory>
#include <QSystemTrayIcon>
#include <QWebEngineContextMenuData>
#include <QWebEngineCookieStore>
#include <QWebEngineFullScreenRequest>
#include <QWebEngineProfile>
Expand Down
10 changes: 3 additions & 7 deletions src/notificationpopup.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@

#include <QApplication>
#include <QDebug>
#include <QDesktopWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include <QPushButton>
#include <QScreen>
#include <QScreen>
#include <QSpacerItem>
#include <QTimer>
#include <QVBoxLayout>
Expand Down Expand Up @@ -131,13 +129,11 @@ protected slots:
}

void onClosed() {
auto x = this->pos().x();
auto y = this->pos().y();
auto pos = mapToGlobal(QPoint(0, 0));
QPropertyAnimation *a = new QPropertyAnimation(this, "pos");
a->setDuration(150);
a->setStartValue(QApplication::desktop()->mapToGlobal(QPoint(x, y)));
a->setEndValue(QApplication::desktop()->mapToGlobal(
QPoint(x, -(this->height() + 20))));
a->setStartValue(pos);
a->setEndValue(QPoint(pos.x(), -(this->height() + 20)));
a->setEasingCurve(QEasingCurve::Linear);

connect(a, &QPropertyAnimation::finished, this, [=]() {
Expand Down
2 changes: 1 addition & 1 deletion src/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ QString Utils::convertSectoDay(qint64 secs) {
QString
Utils::returnPath(QString pathname,
QString standardLocation = QStandardPaths::writableLocation(
QStandardPaths::DataLocation)) {
QStandardPaths::AppLocalDataLocation)) {
QChar sepe = QDir::separator();
QDir d(standardLocation + sepe + pathname);
d.mkpath(standardLocation + sepe + pathname);
Expand Down
29 changes: 26 additions & 3 deletions src/webenginepage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ WebEnginePage::WebEnginePage(QWebEngineProfile *profile, QObject *parent)
connect(this, &QWebEnginePage::selectClientCertificate, this,
&WebEnginePage::handleSelectClientCertificate);
#endif

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
connect(this, &QWebEnginePage::certificateError, this,
&WebEnginePage::handleCertificateError);
#endif
}

bool WebEnginePage::acceptNavigationRequest(const QUrl &url,
Expand Down Expand Up @@ -196,7 +201,13 @@ QStringList WebEnginePage::chooseFiles(QWebEnginePage::FileSelectionMode mode,
return selectedFiles;
}

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
void WebEnginePage::handleCertificateError(const QWebEngineCertificateError &error) {
QString description = error.description();
#else
bool WebEnginePage::certificateError(const QWebEngineCertificateError &error) {
QString description = error.errorDescription();
#endif
QWidget *mainWindow = view()->window();
if (error.isOverridable()) {
QDialog dialog(mainWindow);
Expand All @@ -209,14 +220,26 @@ bool WebEnginePage::certificateError(const QWebEngineCertificateError &error) {
QIcon icon(mainWindow->style()->standardIcon(QStyle::SP_MessageBoxWarning,
nullptr, mainWindow));
certificateDialog.m_iconLabel->setPixmap(icon.pixmap(32, 32));
certificateDialog.m_errorLabel->setText(error.errorDescription());
certificateDialog.m_errorLabel->setText(description);
dialog.setWindowTitle(tr("Certificate Error"));
return dialog.exec() == QDialog::Accepted;
bool accepted = dialog.exec() == QDialog::Accepted;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
auto handler = const_cast<QWebEngineCertificateError&>(error);
if (accepted)
handler.acceptCertificate();
else
handler.rejectCertificate();
#else
return accepted;
#endif
}

QMessageBox::critical(mainWindow, tr("Certificate Error"),
error.errorDescription());
description);

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
return false;
#endif
}

void WebEnginePage::handleAuthenticationRequired(const QUrl &requestUrl,
Expand Down
17 changes: 16 additions & 1 deletion src/webenginepage.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
#include <QWebEngineRegisterProtocolHandlerRequest>
#include <QWebEngineSettings>

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QWebEngineView>
#endif

#include "settingsmanager.h"

#include "ui_certificateerrordialog.h"
Expand All @@ -32,10 +36,21 @@ class WebEnginePage : public QWebEnginePage {
QWebEnginePage::NavigationType type,
bool isMainFrame) override;
QWebEnginePage *createWindow(QWebEnginePage::WebWindowType type) override;
bool certificateError(const QWebEngineCertificateError &error) override;
QStringList chooseFiles(FileSelectionMode mode, const QStringList &oldFiles,
const QStringList &acceptedMimeTypes) override;

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
void handleCertificateError(const QWebEngineCertificateError &error);
#else
bool certificateError(const QWebEngineCertificateError &error) override;
#endif

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
inline QWidget *view() {
return QWebEngineView::forPage(this);
}
#endif

public slots:
void handleFeaturePermissionRequested(const QUrl &securityOrigin,
QWebEnginePage::Feature feature);
Expand Down
Loading

0 comments on commit 2370015

Please sign in to comment.