Merge pull request #1071 from barry-ran/dev
Some checks are pending
MacOS / Build (push) Waiting to run
Ubuntu / Build (push) Waiting to run
Windows / Build (push) Waiting to run

sync dev
This commit is contained in:
Barry 2024-12-07 00:37:30 +08:00 committed by GitHub
commit 0a9871290f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 153 additions and 111 deletions

View file

@ -13,7 +13,7 @@ on:
jobs: jobs:
build: build:
name: Build name: Build
runs-on: macos-11 runs-on: macos-14
strategy: strategy:
matrix: matrix:
qt-ver: [5.15.2] qt-ver: [5.15.2]
@ -26,12 +26,12 @@ jobs:
steps: steps:
- name: Cache Qt - name: Cache Qt
id: cache-qt id: cache-qt
uses: actions/cache@v1 uses: actions/cache@v4
with: with:
path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }} path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }}
key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch-install }} key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch-install }}
- name: Install Qt - name: Install Qt
uses: jurplel/install-qt-action@v2.13.0 uses: jurplel/install-qt-action@v4.1.1
with: with:
version: ${{ matrix.qt-ver }} version: ${{ matrix.qt-ver }}
cached: ${{ steps.cache-qt.outputs.cache-hit }} cached: ${{ steps.cache-qt.outputs.cache-hit }}
@ -65,7 +65,7 @@ jobs:
mv ci/build/QtScrcpy.app ci/build/${{ env.publish_name }}.app mv ci/build/QtScrcpy.app ci/build/${{ env.publish_name }}.app
mv ci/build/QtScrcpy.dmg ci/build/${{ env.publish_name }}.dmg mv ci/build/QtScrcpy.dmg ci/build/${{ env.publish_name }}.dmg
echo "::set-output name=package-name::${{ env.publish_name }}" echo "::set-output name=package-name::${{ env.publish_name }}"
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v4
with: with:
name: ${{ steps.package.outputs.package-name }}.zip name: ${{ steps.package.outputs.package-name }}.zip
path: ci/build/${{ steps.package.outputs.package-name }}.dmg path: ci/build/${{ steps.package.outputs.package-name }}.dmg

View file

@ -27,13 +27,13 @@ jobs:
plantform-des: ubuntu plantform-des: ubuntu
steps: steps:
- name: Install Qt - name: Install Qt
uses: jurplel/install-qt-action@v2.13.0 uses: jurplel/install-qt-action@v4.1.1
with: with:
version: ${{ matrix.qt-ver }} version: ${{ matrix.qt-ver }}
cached: ${{ steps.cache-qt.outputs.cache-hit }} cached: ${{ steps.cache-qt.outputs.cache-hit }}
- name: Cache Qt - name: Cache Qt
id: cache-qt id: cache-qt
uses: actions/cache@v3.0.6 uses: actions/cache@v4
with: with:
path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }} path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }}
key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch-install }} key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch-install }}
@ -50,7 +50,7 @@ jobs:
run: | run: |
ci/linux/build_for_linux.sh "RelWithDebInfo" ci/linux/build_for_linux.sh "RelWithDebInfo"
- name: Upload RelWithDebInfo - name: Upload RelWithDebInfo
uses: actions/upload-artifact@v3.1.0 uses: actions/upload-artifact@v4
with: with:
name: QtScrcpy-${{ matrix.os }}-${{ matrix.qt-arch-install }}-RelWithDebInfo name: QtScrcpy-${{ matrix.os }}-${{ matrix.qt-arch-install }}-RelWithDebInfo
path: output/x64/RelWithDebInfo/* path: output/x64/RelWithDebInfo/*
@ -60,7 +60,7 @@ jobs:
run: | run: |
ci/linux/build_for_linux.sh "Release" ci/linux/build_for_linux.sh "Release"
- name: Upload Release - name: Upload Release
uses: actions/upload-artifact@v3.1.0 uses: actions/upload-artifact@v4
with: with:
name: QtScrcpy-${{ matrix.os }}-${{ matrix.qt-arch-install }}-Release name: QtScrcpy-${{ matrix.os }}-${{ matrix.qt-arch-install }}-Release
path: output/x64/Release/* path: output/x64/Release/*

View file

@ -47,14 +47,14 @@ jobs:
steps: steps:
- name: Cache Qt - name: Cache Qt
id: cache-qt id: cache-qt
uses: actions/cache@v1 uses: actions/cache@v4
with: with:
path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }} path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }}
key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch }} key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch }}
# 安装Qt # 安装Qt
- name: Install Qt - name: Install Qt
# 使用外部action。这个action专门用来安装Qt # 使用外部action。这个action专门用来安装Qt
uses: jurplel/install-qt-action@v2.13.0 uses: jurplel/install-qt-action@v4.1.1
with: with:
# Version of Qt to install # Version of Qt to install
version: ${{ matrix.qt-ver }} version: ${{ matrix.qt-ver }}
@ -100,7 +100,7 @@ jobs:
echo "::set-output name=package-name::${{ env.publish_name }}" echo "::set-output name=package-name::${{ env.publish_name }}"
# 上传artifacts # 上传artifacts
# https://help.github.com/en/actions/configuring-and-managing-workflows/persisting-workflow-data-using-artifacts # https://help.github.com/en/actions/configuring-and-managing-workflows/persisting-workflow-data-using-artifacts
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v4
with: with:
name: ${{ steps.package.outputs.package-name }}.zip name: ${{ steps.package.outputs.package-name }}.zip
path: ci\build\${{ steps.package.outputs.package-name }} path: ci\build\${{ steps.package.outputs.package-name }}

@ -1 +1 @@
Subproject commit 769943161f99dbc7b0c55f7f769e32729ab06693 Subproject commit eb8b7837b18d4d2c13276d90884feb7f1c37d7ba

Binary file not shown.

View file

@ -135,10 +135,6 @@
<source>Start Config</source> <source>Start Config</source>
<translation>Start Config</translation> <translation>Start Config</translation>
</message> </message>
<message>
<source>record save path:</source>
<translation>record save path:</translation>
</message>
<message> <message>
<source>select path</source> <source>select path</source>
<translation>select path</translation> <translation>select path</translation>
@ -297,5 +293,13 @@
<source>auto update</source> <source>auto update</source>
<translation>auto update</translation> <translation>auto update</translation>
</message> </message>
<message>
<source>show toolbar</source>
<translation>show toolbar</translation>
</message>
<message>
<source>record save path:</source>
<translation>record save path:</translation>
</message>
</context> </context>
</TS> </TS>

Binary file not shown.

View file

@ -135,10 +135,6 @@
<source>Start Config</source> <source>Start Config</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>record save path:</source>
<translation></translation>
</message>
<message> <message>
<source>select path</source> <source>select path</source>
<translation></translation> <translation></translation>
@ -297,5 +293,13 @@
<source>auto update</source> <source>auto update</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>show toolbar</source>
<translation></translation>
</message>
<message>
<source>record save path:</source>
<translation></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -195,6 +195,7 @@ void Dialog::updateBootConfig(bool toView)
ui->stayAwakeCheck->setChecked(config.keepAlive); ui->stayAwakeCheck->setChecked(config.keepAlive);
ui->useSingleModeCheck->setChecked(config.simpleMode); ui->useSingleModeCheck->setChecked(config.simpleMode);
ui->autoUpdatecheckBox->setChecked(config.autoUpdateDevice); ui->autoUpdatecheckBox->setChecked(config.autoUpdateDevice);
ui->showToolbar->setChecked(config.showToolbar);
} else { } else {
UserBootConfig config; UserBootConfig config;
@ -213,6 +214,8 @@ void Dialog::updateBootConfig(bool toView)
config.keepAlive = ui->stayAwakeCheck->isChecked(); config.keepAlive = ui->stayAwakeCheck->isChecked();
config.simpleMode = ui->useSingleModeCheck->isChecked(); config.simpleMode = ui->useSingleModeCheck->isChecked();
config.autoUpdateDevice = ui->autoUpdatecheckBox->isChecked(); config.autoUpdateDevice = ui->autoUpdatecheckBox->isChecked();
config.showToolbar = ui->showToolbar->isChecked();
Config::getInstance().setUserBootConfig(config); Config::getInstance().setUserBootConfig(config);
} }
} }
@ -308,7 +311,10 @@ void Dialog::on_startServerBtn_clicked()
params.useReverse = ui->useReverseCheck->isChecked(); params.useReverse = ui->useReverseCheck->isChecked();
params.display = !ui->notDisplayCheck->isChecked(); params.display = !ui->notDisplayCheck->isChecked();
params.renderExpiredFrames = Config::getInstance().getRenderExpiredFrames(); params.renderExpiredFrames = Config::getInstance().getRenderExpiredFrames();
params.lockVideoOrientation = ui->lockOrientationBox->currentIndex() - 1; if (ui->lockOrientationBox->currentIndex() > 0) {
params.captureOrientationLock = 1;
params.captureOrientation = (ui->lockOrientationBox->currentIndex() - 1) * 90;
}
params.stayAwake = ui->stayAwakeCheck->isChecked(); params.stayAwake = ui->stayAwakeCheck->isChecked();
params.recordFile = ui->recordScreenCheck->isChecked(); params.recordFile = ui->recordScreenCheck->isChecked();
params.recordPath = ui->recordPathEdt->text().trimmed(); params.recordPath = ui->recordPathEdt->text().trimmed();
@ -447,14 +453,15 @@ void Dialog::onDeviceConnected(bool success, const QString &serial, const QStrin
if (!success) { if (!success) {
return; return;
} }
auto videoForm = new VideoForm(ui->framelessCheck->isChecked(), Config::getInstance().getSkin(), ui->showToolbar->isChecked());
auto videoForm = new VideoForm(ui->framelessCheck->isChecked(), Config::getInstance().getSkin());
videoForm->setSerial(serial); videoForm->setSerial(serial);
qsc::IDeviceManage::getInstance().getDevice(serial)->setUserData(static_cast<void*>(videoForm)); qsc::IDeviceManage::getInstance().getDevice(serial)->setUserData(static_cast<void*>(videoForm));
qsc::IDeviceManage::getInstance().getDevice(serial)->registerDeviceObserver(videoForm); qsc::IDeviceManage::getInstance().getDevice(serial)->registerDeviceObserver(videoForm);
videoForm->showFPS(ui->fpsCheck->isChecked()); videoForm->showFPS(ui->fpsCheck->isChecked());
if (ui->alwaysTopCheck->isChecked()) { if (ui->alwaysTopCheck->isChecked()) {
videoForm->staysOnTop(); videoForm->staysOnTop();
} }

View file

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1293</width> <width>1293</width>
<height>454</height> <height>502</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -255,7 +255,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::ClickFocus</enum> <enum>Qt::NoFocus</enum>
</property> </property>
<property name="documentTitle"> <property name="documentTitle">
<string/> <string/>
@ -626,6 +626,80 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item row="0" column="4">
<widget class="QCheckBox" name="fpsCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>show fps</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="notDisplayCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>background record</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="alwaysTopCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>always on top</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="recordScreenCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>record screen</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QCheckBox" name="useReverseCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>reverse connection</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QCheckBox" name="closeScreenCheck"> <widget class="QCheckBox" name="closeScreenCheck">
<property name="sizePolicy"> <property name="sizePolicy">
@ -652,80 +726,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QCheckBox" name="alwaysTopCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>always on top</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="notDisplayCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>background record</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QCheckBox" name="useReverseCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>reverse connection</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="recordScreenCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>record screen</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QCheckBox" name="fpsCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>show fps</string>
</property>
</widget>
</item>
<item row="1" column="4"> <item row="1" column="4">
<widget class="QCheckBox" name="stayAwakeCheck"> <widget class="QCheckBox" name="stayAwakeCheck">
<property name="sizePolicy"> <property name="sizePolicy">
@ -739,6 +739,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0">
<widget class="QCheckBox" name="showToolbar">
<property name="text">
<string>show toolbar</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -1140,7 +1147,7 @@
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
@ -1148,10 +1155,13 @@
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>40</width>
<height>40</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>

View file

@ -21,13 +21,14 @@
#include "ui_videoform.h" #include "ui_videoform.h"
#include "videoform.h" #include "videoform.h"
VideoForm::VideoForm(bool framelessWindow, bool skin, QWidget *parent) : QWidget(parent), ui(new Ui::videoForm), m_skin(skin) VideoForm::VideoForm(bool framelessWindow, bool skin, bool showToolbar, QWidget *parent) : QWidget(parent), ui(new Ui::videoForm), m_skin(skin)
{ {
ui->setupUi(this); ui->setupUi(this);
initUI(); initUI();
installShortcut(); installShortcut();
updateShowSize(size()); updateShowSize(size());
bool vertical = size().height() > size().width(); bool vertical = size().height() > size().width();
this->show_toolbar = showToolbar;
if (m_skin) { if (m_skin) {
updateStyleSheet(vertical); updateStyleSheet(vertical);
} }
@ -479,7 +480,7 @@ void VideoForm::switchFullScreen()
if (m_skin) { if (m_skin) {
updateStyleSheet(m_frameSize.height() > m_frameSize.width()); updateStyleSheet(m_frameSize.height() > m_frameSize.width());
} }
showToolForm(true); showToolForm(this->show_toolbar);
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
::SetThreadExecutionState(ES_CONTINUOUS); ::SetThreadExecutionState(ES_CONTINUOUS);
#endif #endif
@ -721,9 +722,9 @@ void VideoForm::paintEvent(QPaintEvent *paint)
void VideoForm::showEvent(QShowEvent *event) void VideoForm::showEvent(QShowEvent *event)
{ {
Q_UNUSED(event) Q_UNUSED(event)
if (!isFullScreen()) { if (!isFullScreen() && this->show_toolbar) {
QTimer::singleShot(500, this, [this](){ QTimer::singleShot(500, this, [this](){
showToolForm(); showToolForm(this->show_toolbar);
}); });
} }
} }

View file

@ -19,7 +19,7 @@ class VideoForm : public QWidget, public qsc::DeviceObserver
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit VideoForm(bool framelessWindow = false, bool skin = true, QWidget *parent = 0); explicit VideoForm(bool framelessWindow = false, bool skin = true, bool showToolBar = true, QWidget *parent = 0);
~VideoForm(); ~VideoForm();
void staysOnTop(bool top = true); void staysOnTop(bool top = true);
@ -32,7 +32,6 @@ public:
void removeBlackRect(); void removeBlackRect();
void showFPS(bool show); void showFPS(bool show);
void switchFullScreen(); void switchFullScreen();
bool isHost(); bool isHost();
private: private:
@ -85,6 +84,9 @@ private:
bool m_skin = true; bool m_skin = true;
QPoint m_fullScreenBeforePos; QPoint m_fullScreenBeforePos;
QString m_serial; QString m_serial;
//Whether to display the toolbar when connecting a device.
bool show_toolbar = true;
}; };
#endif // VIDEOFORM_H #endif // VIDEOFORM_H

View file

@ -96,6 +96,9 @@
#define COMMON_TRAY_MESSAGE_SHOWN_KEY "TrayMessageShown" #define COMMON_TRAY_MESSAGE_SHOWN_KEY "TrayMessageShown"
#define COMMON_TRAY_MESSAGE_SHOWN_DEF false #define COMMON_TRAY_MESSAGE_SHOWN_DEF false
#define COMMON_SHOW_TOOLBAR_KEY "showToolbar"
#define COMMON_SHOW_TOOLBAR_DEF true
// device config // device config
#define SERIAL_WINDOW_RECT_KEY_X "WindowRectX" #define SERIAL_WINDOW_RECT_KEY_X "WindowRectX"
#define SERIAL_WINDOW_RECT_KEY_Y "WindowRectY" #define SERIAL_WINDOW_RECT_KEY_Y "WindowRectY"
@ -163,6 +166,7 @@ void Config::setUserBootConfig(const UserBootConfig &config)
m_userData->setValue(COMMON_KEEP_ALIVE_KEY, config.keepAlive); m_userData->setValue(COMMON_KEEP_ALIVE_KEY, config.keepAlive);
m_userData->setValue(COMMON_SIMPLE_MODE_KEY, config.simpleMode); m_userData->setValue(COMMON_SIMPLE_MODE_KEY, config.simpleMode);
m_userData->setValue(COMMON_AUTO_UPDATE_DEVICE_KEY, config.autoUpdateDevice); m_userData->setValue(COMMON_AUTO_UPDATE_DEVICE_KEY, config.autoUpdateDevice);
m_userData->setValue(COMMON_SHOW_TOOLBAR_KEY, config.showToolbar);
m_userData->endGroup(); m_userData->endGroup();
m_userData->sync(); m_userData->sync();
} }
@ -186,6 +190,7 @@ UserBootConfig Config::getUserBootConfig()
config.keepAlive = m_userData->value(COMMON_KEEP_ALIVE_KEY, COMMON_KEEP_ALIVE_DEF).toBool(); config.keepAlive = m_userData->value(COMMON_KEEP_ALIVE_KEY, COMMON_KEEP_ALIVE_DEF).toBool();
config.simpleMode = m_userData->value(COMMON_SIMPLE_MODE_KEY, COMMON_SIMPLE_MODE_DEF).toBool(); config.simpleMode = m_userData->value(COMMON_SIMPLE_MODE_KEY, COMMON_SIMPLE_MODE_DEF).toBool();
config.autoUpdateDevice = m_userData->value(COMMON_AUTO_UPDATE_DEVICE_KEY, COMMON_AUTO_UPDATE_DEVICE_DEF).toBool(); config.autoUpdateDevice = m_userData->value(COMMON_AUTO_UPDATE_DEVICE_KEY, COMMON_AUTO_UPDATE_DEVICE_DEF).toBool();
config.showToolbar =m_userData->value(COMMON_SHOW_TOOLBAR_KEY,COMMON_SHOW_TOOLBAR_DEF).toBool();
m_userData->endGroup(); m_userData->endGroup();
return config; return config;
} }

View file

@ -22,6 +22,7 @@ struct UserBootConfig
bool keepAlive = false; bool keepAlive = false;
bool simpleMode = false; bool simpleMode = false;
bool autoUpdateDevice = true; bool autoUpdateDevice = true;
bool showToolbar = true;
}; };
class QSettings; class QSettings;

View file

@ -55,6 +55,10 @@ You can control all your phones at the same time.
![group-control-demo](docs/image/group-control.gif) ![group-control-demo](docs/image/group-control.gif)
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=barry-ran/QtScrcpy&type=Date)](https://star-history.com/#barry-ran/QtScrcpy&Date)
## Thanks ## Thanks
QtScrcpy is based on [Genymobile](https://github.com/Genymobile)'s [scrcpy](https://github.com/Genymobile/scrcpy) project. Thanks a lot! QtScrcpy is based on [Genymobile](https://github.com/Genymobile)'s [scrcpy](https://github.com/Genymobile/scrcpy) project. Thanks a lot!
@ -124,7 +128,7 @@ For users in other distros, you can use the prebuilt archives from Releases:
- [`QtScrcpy`][github-download] - [`QtScrcpy`][github-download]
or you can get it at [GitHub Actions](https://github.com/UjhhgtgTeams/QtScrcpy/actions/workflows/ubuntu.yml), in branch `dev` and download the latest artifact. or you can get it at [GitHub Actions](https://github.com/barry-ran/QtScrcpy/actions/workflows/ubuntu.yml), in branch `dev` and download the latest artifact.
or you can [build it yourself](#Build) (not recommended, get it in Actions if you can) or you can [build it yourself](#Build) (not recommended, get it in Actions if you can)

View file

@ -42,7 +42,7 @@ QtScrcpy 可以通过 USB / 网络连接Android设备并进行显示和控制
- cpu占用率低纯C++开发高性能GPU视频渲染 - cpu占用率低纯C++开发高性能GPU视频渲染
- 高分辨率:可调节,最大支持安卓终端的原生分辨率 - 高分辨率:可调节,最大支持安卓终端的原生分辨率
- 完美中文输入支持闲鱼app支持三星手机 - 完美中文输入支持闲鱼app支持三星手机
- 免费版最多投屏20台功能无限制(除了自动重新投屏) - 免费版最多投屏10台功能无限制(除了自动重新投屏)
- 极限投屏使用教程https://lrbnfell4p.feishu.cn/docx/QRMhd9nImorAGgxVLlmczxSdnYf - 极限投屏使用教程https://lrbnfell4p.feishu.cn/docx/QRMhd9nImorAGgxVLlmczxSdnYf
- 极限投屏qq交流群822464342 - 极限投屏qq交流群822464342
- 极限投屏界面预览: - 极限投屏界面预览:
@ -69,6 +69,10 @@ QtScrcpy 可以通过 USB / 网络连接Android设备并进行显示和控制
## 批量操作 ## 批量操作
你可以同时控制所有的手机 你可以同时控制所有的手机
## Star历史
[![Star History Chart](https://api.star-history.com/svg?repos=barry-ran/QtScrcpy&type=Date)](https://star-history.com/#barry-ran/QtScrcpy&Date)
![gc](docs/image/group-control.gif) ![gc](docs/image/group-control.gif)
## 感谢 ## 感谢

View file

@ -10,7 +10,7 @@ RenderExpiredFrames=0
# 视频解码方式:-1 自动0 软解1 dx硬解2 opengl硬解 # 视频解码方式:-1 自动0 软解1 dx硬解2 opengl硬解
UseDesktopOpenGL=-1 UseDesktopOpenGL=-1
# scrcpy-server的版本号不要修改 # scrcpy-server的版本号不要修改
ServerVersion=2.4 ServerVersion=3.0.2
# scrcpy-server推送到安卓设备的路径 # scrcpy-server推送到安卓设备的路径
ServerPath=/data/local/tmp/scrcpy-server.jar ServerPath=/data/local/tmp/scrcpy-server.jar
# 自定义adb路径例如D:/android/tools/adb.exe # 自定义adb路径例如D:/android/tools/adb.exe