本页内容

QScreenCapture Class

该类用于截取屏幕。更多...

头文件: #include <QScreenCapture>
CMake: find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(mytarget PRIVATE Qt6::Multimedia)
qmake: QT += multimedia
自: Qt 6.5
在 QML 中: ScreenCapture
继承自: QObject

公共类型

enum Error { NoError, InternalError, CapturingNotSupported, CaptureFailed, NotFound }

属性

公共函数

QMediaCaptureSession *captureSession() const
QScreenCapture::Error error() const
QString errorString() const
bool isActive() const
std::optional<qreal> maximumFrameRate() const
QScreen *screen() const
void setMaximumFrameRate(std::optional<qreal> frameRate)
void setScreen(QScreen *screen)

公共槽位

void setActive(bool active)
void start()
void stop()

信号

void activeChanged(bool)
void errorChanged()
void errorOccurred(QScreenCapture::Error error, const QString &errorString)
void maximumFrameRateChanged()
void screenChanged(QScreen *)

详细说明

该类用于捕获屏幕。它由QMediaCaptureSession 类进行管理,捕获的屏幕既可以在视频预览对象中显示,也可以录制到文件中。

以下代码片段演示了如何捕获主屏幕并将结果显示在QVideoWidget 中:

QMediaCaptureSession session;
QScreenCapture screenCapture;
session.setScreenCapture(&screenCapture);

QVideoWidget videoWidget;
session.setVideoOutput(&videoWidget);
videoWidget.show();

// With no screen set, the primary screen is captured once capturing starts.
screenCapture.start();

屏幕捕获的限制

在 Qt 6.5.2 及以上版本中,使用 QScreenCapture 时存在以下限制:

  • 仅支持 FFmpeg 后端。
  • 在某些平台上,当捕获的屏幕内容保持不变时,不会输出新的视频帧。因此,应用程序不应依赖于以请求的帧率持续接收帧流。
  • 在使用 Wayland 合成器的 Linux 系统上,屏幕截图的实现尚处于实验阶段,并存在以下限制。由于 Wayland 协议的限制,无法通过 `QScreenCapture ` 类的 API 设置和获取目标屏幕。 取而代之的是,在调用 `QScreenCapture::setActive(true)` 时,操作系统会显示一个屏幕选择向导。屏幕捕获功能需要安装由XDG Desktop Portal和PipeWire(0.3) 支持的ScreenCast服务。这些限制在未来可能会发生变化。
  • 除 Android 外,该功能不支持移动操作系统。在 Android 上进行屏幕截图需要向 `AndroidManifest.xml ` 文件中添加额外的Android 前台服务权限:
    <manifest ...>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <application ...>
        <service android:name="org.qtproject.qt.android.multimedia.QtScreenCaptureService"
            android:foregroundServiceType="mediaProjection"
            android:exported="false"/>
        </service>
    </application>
    </manifest>
  • 在采用 EGLFS 的嵌入式系统中,该功能受到限制。对于Qt Quick 应用程序,该类目前通过QQuickWindow::grabWindow 实现,这可能会导致性能问题。
  • 在大多数情况下,我们会将屏幕截图帧率设置为与屏幕刷新率相同,但 Windows 系统除外,该系统的帧率可能具有灵活性。如果截图分辨率达到 4K,此类帧率(75/120 FPS)可能会在性能较弱的 CPU 上引发性能问题。 在 EGLFS 上,捕获帧率目前被锁定为 30 FPS。

另请参阅 QWindowCapture 和QMediaCaptureSession 。

成员类型文档

enum QScreenCapture::Error

列举了QScreenCapture 类可能抛出的错误代码。errorString() 方法提供有关错误原因的详细信息。

常量值描述
QScreenCapture::NoError0无错误
QScreenCapture::InternalError1内部屏幕捕获驱动程序错误
QScreenCapture::CapturingNotSupported2不支持屏幕捕获
QScreenCapture::CaptureFailed4屏幕捕获失败
QScreenCapture::NotFound5未找到所选屏幕

属性文档

active : bool

该属性表示捕获操作当前是否处于活动状态。

访问函数:

bool isActive() const
void setActive(bool active)

通知信号:

void activeChanged(bool)

另请参阅 start() 和stop()。

[read-only] error : Error

该属性存储了上次错误的代码。

访问函数:

QScreenCapture::Error error() const

通知信号:

void errorChanged()

[read-only] errorString : QString

该属性包含一个描述错误原因的人类可读字符串。

访问函数:

QString errorString() const

通知信号:

void errorChanged()

[since 6.12] maximumFrameRate : std::optional<qreal>

此属性用于设置屏幕捕获帧率的上限。

可以设置此属性以覆盖默认基于显示器刷新率等参数确定的截图帧率,但这仅作为上限,因为屏幕截图产生的帧率是可变的。不建议将此值设置得高于显示器刷新率,否则可能会导致错误。

对该属性的任何更改将在QScreenCapture 下次激活时生效。

该枚举在 Qt 6.12 中引入。

访问函数:

std::optional<qreal> maximumFrameRate() const
void setMaximumFrameRate(std::optional<qreal> frameRate)

通知器信号:

void maximumFrameRateChanged()

screen : QScreen*

该属性用于锁定用于截图的屏幕。

如果设置为 nullQScreen ,则当QScreenCapture 实例被激活时,将选择QGuiApplication::primaryScreen 。

访问函数:

QScreen *screen() const
void setScreen(QScreen *screen)

通知信号:

void screenChanged(QScreen *)

另请参阅 QGuiApplication::screens() 和QGuiApplication::primaryScreen()。

成员函数文档

QMediaCaptureSession *QScreenCapture::captureSession() const

返回此QScreenCapture 所连接的屏幕录制会话。

使用QMediaCaptureSession::setScreenCapture() 将屏幕捕获与会话建立关联。

[signal] void QScreenCapture::errorChanged()

当error 或errorString 属性发生变化时,会触发此信号。

当抛出多个相同的错误时,不会触发此信号。若要跟踪此类错误,请使用errorOccurred 信号。

注意: 这是针对属性error 和errorString的通知器 信号。

[signal] void QScreenCapture::errorOccurred(QScreenCapture::Error error, const QString &errorString)

当发生error 时,会触发相应信号,同时触发errorString 。

[slot] void QScreenCapture::start()

开始捕获screen 。

这相当于将active 属性设置为true。

[slot] void QScreenCapture::stop()

停止捕获。

这相当于将active 属性设置为false。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.