Skip to content

Commit acae176

Browse files
committed
feat: Enable Qt6 build
Enable build with Qt6 and compat Qt5, the user can select which Qt version by configuration parameter. Log: Enable Qt6 build.
1 parent e45d505 commit acae176

File tree

10 files changed

+192
-61
lines changed

10 files changed

+192
-61
lines changed

QtScrcpy/CMakeLists.txt

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,49 @@ endif()
7575
# Qt
7676
#
7777

78+
# Find Qt version
79+
if (NOT QT_DESIRED_VERSION)
80+
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
81+
message(" >>> Found Qt version: ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH}")
82+
set(QT_DESIRED_VERSION ${QT_VERSION_MAJOR})
83+
endif()
84+
7885
set(CMAKE_AUTOUIC ON)
7986
set(CMAKE_AUTOMOC ON)
8087
set(CMAKE_AUTORCC ON)
8188

82-
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets Network Multimedia REQUIRED)
83-
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network Multimedia REQUIRED)
84-
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
85-
find_package(QT NAMES Qt6 Qt5 COMPONENTS X11Extras REQUIRED)
86-
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS X11Extras REQUIRED)
89+
set(qt_required_components Widgets Network Multimedia)
90+
91+
if (QT_DESIRED_VERSION MATCHES 6)
92+
# list(APPEND qt_required_components Core5Compat)
93+
list(APPEND qt_required_components OpenGL)
94+
list(APPEND qt_required_components OpenGLWidgets)
95+
else()
96+
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
97+
list(APPEND qt_required_components X11Extras )
98+
endif()
99+
endif()
100+
101+
find_package(Qt${QT_DESIRED_VERSION} REQUIRED COMPONENTS ${qt_required_components})
102+
103+
set(LINK_LIBS
104+
Qt${QT_DESIRED_VERSION}::Widgets
105+
Qt${QT_DESIRED_VERSION}::Network
106+
Qt${QT_DESIRED_VERSION}::Multimedia
107+
)
108+
109+
if (QT_DESIRED_VERSION MATCHES 6)
110+
# list(APPEND LINK_LIBS Qt${QT_DESIRED_VERSION}::Core5Compat)
111+
list(APPEND LINK_LIBS Qt${QT_DESIRED_VERSION}::GuiPrivate)
112+
list(APPEND LINK_LIBS Qt${QT_DESIRED_VERSION}::OpenGL)
113+
list(APPEND LINK_LIBS Qt${QT_DESIRED_VERSION}::OpenGLWidgets)
114+
else()
115+
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
116+
list(APPEND LINK_LIBS Qt${QT_DESIRED_VERSION}::X11Extras)
117+
endif()
87118
endif()
88119

89-
message(STATUS "[${PROJECT_NAME}] Qt version is: ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}")
120+
message(STATUS "[${PROJECT_NAME}] Qt version is: ${QT_DESIRED_VERSION}")
90121

91122
#
92123
# Sources
@@ -312,8 +343,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
312343
find_package(Threads REQUIRED)
313344

314345
target_link_libraries(${PROJECT_NAME} PRIVATE
315-
# qx11
316-
Qt${QT_VERSION_MAJOR}::X11Extras
317346
# xcb https://doc.qt.io/qt-5/linux-requirements.html
318347
xcb
319348
# pthread
@@ -331,8 +360,6 @@ add_subdirectory(QtScrcpyCore)
331360

332361
# Qt
333362
target_link_libraries(${PROJECT_NAME} PRIVATE
334-
Qt${QT_VERSION_MAJOR}::Widgets
335-
Qt${QT_VERSION_MAJOR}::Network
336-
Qt${QT_VERSION_MAJOR}::Multimedia
363+
${LINK_LIBS}
337364
QtScrcpyCore
338365
)

QtScrcpy/audio/audiooutput.cpp

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,23 @@
44
#include <QTime>
55
#include <QElapsedTimer>
66

7+
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
8+
#include <QAudioSink>
9+
#include <QAudioDevice>
10+
#include <QMediaDevices>
11+
#endif
12+
713
#include "audiooutput.h"
814

915
AudioOutput::AudioOutput(QObject *parent)
1016
: QObject(parent)
1117
{
18+
m_running = false;
19+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
20+
m_audioOutput = nullptr;
21+
#else
22+
m_audioSink = nullptr;
23+
#endif
1224
connect(&m_sndcpy, &QProcess::readyReadStandardOutput, this, [this]() {
1325
qInfo() << QString("AudioOutput::") << QString(m_sndcpy.readAllStandardOutput());
1426
});
@@ -69,15 +81,10 @@ bool AudioOutput::runSndcpyProcess(const QString &serial, int port, bool wait)
6981
}
7082

7183
#ifdef Q_OS_WIN32
72-
QStringList params;
73-
params << serial;
74-
params << QString("%1").arg(port);
84+
QStringList params{serial, QString::number(port)};
7585
m_sndcpy.start("sndcpy.bat", params);
7686
#else
77-
QStringList params;
78-
params << "sndcpy.sh";
79-
params << serial;
80-
params << QString("%1").arg(port);
87+
QStringList params{"sndcpy.sh", serial, QString::number(port)};
8188
m_sndcpy.start("bash", params);
8289
#endif
8390

@@ -86,11 +93,11 @@ bool AudioOutput::runSndcpyProcess(const QString &serial, int port, bool wait)
8693
}
8794

8895
if (!m_sndcpy.waitForStarted()) {
89-
qWarning() << "AudioOutput::start sndcpy.bat failed";
96+
qWarning() << "AudioOutput::start sndcpy process failed";
9097
return false;
9198
}
9299
if (!m_sndcpy.waitForFinished()) {
93-
qWarning() << "AudioOutput::sndcpy.bat crashed";
100+
qWarning() << "AudioOutput::sndcpy process crashed";
94101
return false;
95102
}
96103

@@ -99,6 +106,7 @@ bool AudioOutput::runSndcpyProcess(const QString &serial, int port, bool wait)
99106

100107
void AudioOutput::startAudioOutput()
101108
{
109+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
102110
if (m_audioOutput) {
103111
return;
104112
}
@@ -110,8 +118,8 @@ void AudioOutput::startAudioOutput()
110118
format.setCodec("audio/pcm");
111119
format.setByteOrder(QAudioFormat::LittleEndian);
112120
format.setSampleType(QAudioFormat::SignedInt);
113-
114121
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
122+
115123
if (!info.isFormatSupported(format)) {
116124
qWarning() << "AudioOutput::audio format not supported, cannot play audio.";
117125
return;
@@ -123,17 +131,47 @@ void AudioOutput::startAudioOutput()
123131
});
124132
m_audioOutput->setBufferSize(48000*2*15/1000 * 20);
125133
m_outputDevice = m_audioOutput->start();
134+
#else
135+
if (m_audioSink) {
136+
return;
137+
}
138+
139+
QAudioFormat format;
140+
format.setSampleRate(48000);
141+
format.setChannelCount(2);
142+
format.setSampleFormat(QAudioFormat::Int16);
143+
QAudioDevice defaultDevice = QMediaDevices::defaultAudioOutput();
144+
if (!defaultDevice.isFormatSupported(format)) {
145+
qWarning() << "AudioOutput::audio format not supported, cannot play audio.";
146+
return;
147+
}
148+
m_audioSink = new QAudioSink(defaultDevice, format, this);
149+
m_outputDevice = m_audioSink->start();
150+
if (!m_outputDevice) {
151+
qWarning() << "AudioOutput::audio output device not available, cannot play audio.";
152+
delete m_audioSink;
153+
m_audioSink = nullptr;
154+
return;
155+
}
156+
#endif
126157
}
127158

128159
void AudioOutput::stopAudioOutput()
129160
{
130-
if (!m_audioOutput) {
131-
return;
161+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
162+
if (m_audioOutput) {
163+
m_audioOutput->stop();
164+
delete m_audioOutput;
165+
m_audioOutput = nullptr;
132166
}
133-
134-
m_audioOutput->stop();
135-
delete m_audioOutput;
136-
m_audioOutput = nullptr;
167+
#else
168+
if (m_audioSink) {
169+
m_audioSink->stop();
170+
delete m_audioSink;
171+
m_audioSink = nullptr;
172+
}
173+
#endif
174+
m_outputDevice = nullptr;
137175
}
138176

139177
void AudioOutput::startRecvData(int port)
@@ -165,7 +203,7 @@ void AudioOutput::startRecvData(int port)
165203
m_buffer.reserve(recv);
166204
}
167205

168-
qint64 count = audioSocket->read(m_buffer.data(), audioSocket->bytesAvailable());
206+
qint64 count = audioSocket->read(m_buffer.data(), recv);
169207
m_outputDevice->write(m_buffer.data(), count);
170208
});
171209
connect(audioSocket, &QTcpSocket::stateChanged, audioSocket, [](QAbstractSocket::SocketState state) {

QtScrcpy/audio/audiooutput.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <QPointer>
77
#include <QVector>
88

9+
class QAudioSink;
910
class QAudioOutput;
1011
class QIODevice;
1112
class AudioOutput : public QObject
@@ -30,12 +31,16 @@ class AudioOutput : public QObject
3031
void connectTo(int port);
3132

3233
private:
33-
QAudioOutput* m_audioOutput = nullptr;
3434
QPointer<QIODevice> m_outputDevice;
3535
QThread m_workerThread;
3636
QProcess m_sndcpy;
3737
QVector<char> m_buffer;
3838
bool m_running = false;
39+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
40+
QAudioOutput* m_audioOutput = nullptr;
41+
#else
42+
QAudioSink *m_audioSink = nullptr;
43+
#endif
3944
};
4045

4146
#endif // AUDIOOUTPUT_H

QtScrcpy/main.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,12 @@ int main(int argc, char *argv[])
5555
QApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
5656
}
5757

58+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
5859
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
5960

6061
#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0))
6162
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
63+
#endif
6264
#endif
6365

6466
QSurfaceFormat varFormat = QSurfaceFormat::defaultFormat();
@@ -142,7 +144,10 @@ void installTranslator()
142144
break;
143145
}
144146

145-
translator.load(languagePath);
147+
auto loaded = translator.load(languagePath);
148+
if (!loaded) {
149+
qWarning() << "Failed to load translation file:" << languagePath;
150+
}
146151
qApp->installTranslator(&translator);
147152
}
148153

QtScrcpy/ui/dialog.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,9 +618,18 @@ void Dialog::on_usbConnectBtn_clicked()
618618

619619
int Dialog::findDeviceFromeSerialBox(bool wifi)
620620
{
621-
QRegExp regIP("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\:([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])\\b");
621+
QString regStr = "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\:([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])\\b";
622+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
623+
QRegExp regIP(regStr);
624+
#else
625+
QRegularExpression regIP(regStr);
626+
#endif
622627
for (int i = 0; i < ui->serialBox->count(); ++i) {
628+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
623629
bool isWifi = regIP.exactMatch(ui->serialBox->itemText(i));
630+
#else
631+
bool isWifi = regIP.match(ui->serialBox->itemText(i)).hasMatch();
632+
#endif
624633
bool found = wifi ? isWifi : !isWifi;
625634
if (found) {
626635
return i;

QtScrcpy/ui/toolform.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,11 @@ void ToolForm::updateGroupControl()
6868
void ToolForm::mousePressEvent(QMouseEvent *event)
6969
{
7070
if (event->button() == Qt::LeftButton) {
71+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
7172
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
73+
#else
74+
m_dragPosition = event->globalPosition().toPoint() - frameGeometry().topLeft();
75+
#endif
7276
event->accept();
7377
}
7478
}
@@ -81,7 +85,11 @@ void ToolForm::mouseReleaseEvent(QMouseEvent *event)
8185
void ToolForm::mouseMoveEvent(QMouseEvent *event)
8286
{
8387
if (event->buttons() & Qt::LeftButton) {
88+
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
8489
move(event->globalPos() - m_dragPosition);
90+
#else
91+
move(event->globalPosition().toPoint() - m_dragPosition);
92+
#endif
8593
event->accept();
8694
}
8795
}

0 commit comments

Comments
 (0)