mirror of
https://github.com/barry-ran/QtScrcpy.git
synced 2025-04-19 19:15:07 +00:00
commit
0a9871290f
17 changed files with 153 additions and 111 deletions
8
.github/workflows/macos.yml
vendored
8
.github/workflows/macos.yml
vendored
|
@ -13,7 +13,7 @@ on:
|
|||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: macos-11
|
||||
runs-on: macos-14
|
||||
strategy:
|
||||
matrix:
|
||||
qt-ver: [5.15.2]
|
||||
|
@ -26,12 +26,12 @@ jobs:
|
|||
steps:
|
||||
- name: Cache Qt
|
||||
id: cache-qt
|
||||
uses: actions/cache@v1
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }}
|
||||
key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch-install }}
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2.13.0
|
||||
uses: jurplel/install-qt-action@v4.1.1
|
||||
with:
|
||||
version: ${{ matrix.qt-ver }}
|
||||
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.dmg ci/build/${{ env.publish_name }}.dmg
|
||||
echo "::set-output name=package-name::${{ env.publish_name }}"
|
||||
- uses: actions/upload-artifact@v1
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.package.outputs.package-name }}.zip
|
||||
path: ci/build/${{ steps.package.outputs.package-name }}.dmg
|
||||
|
|
8
.github/workflows/ubuntu.yml
vendored
8
.github/workflows/ubuntu.yml
vendored
|
@ -27,13 +27,13 @@ jobs:
|
|||
plantform-des: ubuntu
|
||||
steps:
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2.13.0
|
||||
uses: jurplel/install-qt-action@v4.1.1
|
||||
with:
|
||||
version: ${{ matrix.qt-ver }}
|
||||
cached: ${{ steps.cache-qt.outputs.cache-hit }}
|
||||
- name: Cache Qt
|
||||
id: cache-qt
|
||||
uses: actions/cache@v3.0.6
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }}
|
||||
key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch-install }}
|
||||
|
@ -50,7 +50,7 @@ jobs:
|
|||
run: |
|
||||
ci/linux/build_for_linux.sh "RelWithDebInfo"
|
||||
- name: Upload RelWithDebInfo
|
||||
uses: actions/upload-artifact@v3.1.0
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: QtScrcpy-${{ matrix.os }}-${{ matrix.qt-arch-install }}-RelWithDebInfo
|
||||
path: output/x64/RelWithDebInfo/*
|
||||
|
@ -60,7 +60,7 @@ jobs:
|
|||
run: |
|
||||
ci/linux/build_for_linux.sh "Release"
|
||||
- name: Upload Release
|
||||
uses: actions/upload-artifact@v3.1.0
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: QtScrcpy-${{ matrix.os }}-${{ matrix.qt-arch-install }}-Release
|
||||
path: output/x64/Release/*
|
||||
|
|
6
.github/workflows/windows.yml
vendored
6
.github/workflows/windows.yml
vendored
|
@ -47,14 +47,14 @@ jobs:
|
|||
steps:
|
||||
- name: Cache Qt
|
||||
id: cache-qt
|
||||
uses: actions/cache@v1
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.qt-install-path }}/${{ matrix.qt-arch-install }}
|
||||
key: ${{ runner.os }}/${{ matrix.qt-ver }}/${{ matrix.qt-arch }}
|
||||
# 安装Qt
|
||||
- name: Install Qt
|
||||
# 使用外部action。这个action专门用来安装Qt
|
||||
uses: jurplel/install-qt-action@v2.13.0
|
||||
uses: jurplel/install-qt-action@v4.1.1
|
||||
with:
|
||||
# Version of Qt to install
|
||||
version: ${{ matrix.qt-ver }}
|
||||
|
@ -100,7 +100,7 @@ jobs:
|
|||
echo "::set-output name=package-name::${{ env.publish_name }}"
|
||||
# 上传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:
|
||||
name: ${{ steps.package.outputs.package-name }}.zip
|
||||
path: ci\build\${{ steps.package.outputs.package-name }}
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 769943161f99dbc7b0c55f7f769e32729ab06693
|
||||
Subproject commit eb8b7837b18d4d2c13276d90884feb7f1c37d7ba
|
Binary file not shown.
|
@ -135,10 +135,6 @@
|
|||
<source>Start Config</source>
|
||||
<translation>Start Config</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>record save path:</source>
|
||||
<translation>record save path:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>select path</source>
|
||||
<translation>select path</translation>
|
||||
|
@ -297,5 +293,13 @@
|
|||
<source>auto update</source>
|
||||
<translation>auto update</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>show toolbar</source>
|
||||
<translation>show toolbar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>record save path:</source>
|
||||
<translation>record save path:</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
Binary file not shown.
|
@ -135,10 +135,6 @@
|
|||
<source>Start Config</source>
|
||||
<translation>启动配置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>record save path:</source>
|
||||
<translation>录像保存路径:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>select path</source>
|
||||
<translation>选择路径</translation>
|
||||
|
@ -297,5 +293,13 @@
|
|||
<source>auto update</source>
|
||||
<translation>自动刷新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>show toolbar</source>
|
||||
<translation>显示工具栏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>record save path:</source>
|
||||
<translation>录像保存路径</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
|
@ -195,6 +195,7 @@ void Dialog::updateBootConfig(bool toView)
|
|||
ui->stayAwakeCheck->setChecked(config.keepAlive);
|
||||
ui->useSingleModeCheck->setChecked(config.simpleMode);
|
||||
ui->autoUpdatecheckBox->setChecked(config.autoUpdateDevice);
|
||||
ui->showToolbar->setChecked(config.showToolbar);
|
||||
} else {
|
||||
UserBootConfig config;
|
||||
|
||||
|
@ -213,6 +214,8 @@ void Dialog::updateBootConfig(bool toView)
|
|||
config.keepAlive = ui->stayAwakeCheck->isChecked();
|
||||
config.simpleMode = ui->useSingleModeCheck->isChecked();
|
||||
config.autoUpdateDevice = ui->autoUpdatecheckBox->isChecked();
|
||||
config.showToolbar = ui->showToolbar->isChecked();
|
||||
|
||||
Config::getInstance().setUserBootConfig(config);
|
||||
}
|
||||
}
|
||||
|
@ -308,7 +311,10 @@ void Dialog::on_startServerBtn_clicked()
|
|||
params.useReverse = ui->useReverseCheck->isChecked();
|
||||
params.display = !ui->notDisplayCheck->isChecked();
|
||||
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.recordFile = ui->recordScreenCheck->isChecked();
|
||||
params.recordPath = ui->recordPathEdt->text().trimmed();
|
||||
|
@ -447,14 +453,15 @@ void Dialog::onDeviceConnected(bool success, const QString &serial, const QStrin
|
|||
if (!success) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto videoForm = new VideoForm(ui->framelessCheck->isChecked(), Config::getInstance().getSkin());
|
||||
auto videoForm = new VideoForm(ui->framelessCheck->isChecked(), Config::getInstance().getSkin(), ui->showToolbar->isChecked());
|
||||
videoForm->setSerial(serial);
|
||||
|
||||
qsc::IDeviceManage::getInstance().getDevice(serial)->setUserData(static_cast<void*>(videoForm));
|
||||
qsc::IDeviceManage::getInstance().getDevice(serial)->registerDeviceObserver(videoForm);
|
||||
|
||||
|
||||
videoForm->showFPS(ui->fpsCheck->isChecked());
|
||||
|
||||
if (ui->alwaysTopCheck->isChecked()) {
|
||||
videoForm->staysOnTop();
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1293</width>
|
||||
<height>454</height>
|
||||
<height>502</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -255,7 +255,7 @@
|
|||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::ClickFocus</enum>
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="documentTitle">
|
||||
<string/>
|
||||
|
@ -626,6 +626,80 @@
|
|||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</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">
|
||||
<widget class="QCheckBox" name="closeScreenCheck">
|
||||
<property name="sizePolicy">
|
||||
|
@ -652,80 +726,6 @@
|
|||
</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="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">
|
||||
<widget class="QCheckBox" name="stayAwakeCheck">
|
||||
<property name="sizePolicy">
|
||||
|
@ -739,6 +739,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="showToolbar">
|
||||
<property name="text">
|
||||
<string>show toolbar</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -1140,7 +1147,7 @@
|
|||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
|
@ -1148,10 +1155,13 @@
|
|||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
|
|
|
@ -21,13 +21,14 @@
|
|||
#include "ui_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);
|
||||
initUI();
|
||||
installShortcut();
|
||||
updateShowSize(size());
|
||||
bool vertical = size().height() > size().width();
|
||||
this->show_toolbar = showToolbar;
|
||||
if (m_skin) {
|
||||
updateStyleSheet(vertical);
|
||||
}
|
||||
|
@ -479,7 +480,7 @@ void VideoForm::switchFullScreen()
|
|||
if (m_skin) {
|
||||
updateStyleSheet(m_frameSize.height() > m_frameSize.width());
|
||||
}
|
||||
showToolForm(true);
|
||||
showToolForm(this->show_toolbar);
|
||||
#ifdef Q_OS_WIN32
|
||||
::SetThreadExecutionState(ES_CONTINUOUS);
|
||||
#endif
|
||||
|
@ -721,9 +722,9 @@ void VideoForm::paintEvent(QPaintEvent *paint)
|
|||
void VideoForm::showEvent(QShowEvent *event)
|
||||
{
|
||||
Q_UNUSED(event)
|
||||
if (!isFullScreen()) {
|
||||
if (!isFullScreen() && this->show_toolbar) {
|
||||
QTimer::singleShot(500, this, [this](){
|
||||
showToolForm();
|
||||
showToolForm(this->show_toolbar);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ class VideoForm : public QWidget, public qsc::DeviceObserver
|
|||
{
|
||||
Q_OBJECT
|
||||
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();
|
||||
|
||||
void staysOnTop(bool top = true);
|
||||
|
@ -32,7 +32,6 @@ public:
|
|||
void removeBlackRect();
|
||||
void showFPS(bool show);
|
||||
void switchFullScreen();
|
||||
|
||||
bool isHost();
|
||||
|
||||
private:
|
||||
|
@ -85,6 +84,9 @@ private:
|
|||
bool m_skin = true;
|
||||
QPoint m_fullScreenBeforePos;
|
||||
QString m_serial;
|
||||
|
||||
//Whether to display the toolbar when connecting a device.
|
||||
bool show_toolbar = true;
|
||||
};
|
||||
|
||||
#endif // VIDEOFORM_H
|
||||
|
|
|
@ -96,6 +96,9 @@
|
|||
#define COMMON_TRAY_MESSAGE_SHOWN_KEY "TrayMessageShown"
|
||||
#define COMMON_TRAY_MESSAGE_SHOWN_DEF false
|
||||
|
||||
#define COMMON_SHOW_TOOLBAR_KEY "showToolbar"
|
||||
#define COMMON_SHOW_TOOLBAR_DEF true
|
||||
|
||||
// device config
|
||||
#define SERIAL_WINDOW_RECT_KEY_X "WindowRectX"
|
||||
#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_SIMPLE_MODE_KEY, config.simpleMode);
|
||||
m_userData->setValue(COMMON_AUTO_UPDATE_DEVICE_KEY, config.autoUpdateDevice);
|
||||
m_userData->setValue(COMMON_SHOW_TOOLBAR_KEY, config.showToolbar);
|
||||
m_userData->endGroup();
|
||||
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.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.showToolbar =m_userData->value(COMMON_SHOW_TOOLBAR_KEY,COMMON_SHOW_TOOLBAR_DEF).toBool();
|
||||
m_userData->endGroup();
|
||||
return config;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ struct UserBootConfig
|
|||
bool keepAlive = false;
|
||||
bool simpleMode = false;
|
||||
bool autoUpdateDevice = true;
|
||||
bool showToolbar = true;
|
||||
};
|
||||
|
||||
class QSettings;
|
||||
|
|
|
@ -55,6 +55,10 @@ You can control all your phones at the same time.
|
|||
|
||||

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

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