QT实现屏幕截图
屏幕截图是非常常用的功能,但是一直没有自己写过,现在使用QT实现非常简单的全屏截图。
屏幕截图主要使用了QGuiApplication类、QScreen类。
QGuiApplication类管理GUI应用程序的控制流和主设置。
功能实现
代码很简单,只有一个函数,具体代码如下:
1 | // 界面截图 |
截图放在了系统图片目录:
下面详细介绍 QGuiApplication 类和 QScreen类。
QGuiApplication类
QGuiApplication类管理GUI应用程序的控制流和主设置。
QGuiApplication包含主事件循环,其中所有来自窗口系统和其他源的事件都被处理和发送。它还处理应用程序的初始化和终结,并提供会话管理。此外,QGuiApplication处理大多数系统范围和应用程序范围的设置。
对于使用Qt的任何GUI应用程序,无论应用程序在任何给定时间是否有0、1、2或更多窗口,都有一个QGuiApplication对象。对于非GUI Qt应用程序,使用QCoreApplication,因为它不依赖于Qt GUI模块。对于基于Qt的Qt应用程序,使用QApplication代替,因为它提供了创建QWidget实例所需的一些功能。
通过实例()函数访问QGuiApplication对象,该函数返回相当于全局qApp指针的指针。
QGuiApplication的主要职责范围是:
- 它使用用户的桌面设置来初始化应用程序,例如palette()、font()和styleHints()。它跟踪这些属性,以防止用户在全局环境中更改桌面,例如通过某种控制面板。
- 它执行事件处理,这意味着它从底层窗口系统接收事件并将它们分派给相关的小部件。您可以使用sendEvent()和postEvent()将您自己的事件发送到windows。
它解析常见的命令行参数,并相应地设置其内部状态。- 它提供了通过 translate()对用户可见的字符串的本地化。
- 它提供了一些像 clipboard()这样的神奇的对象。
- 它知道应用程序的窗口。您可以使用topLevelAt()来询问哪个窗口位于某个位置,然后获取一个topLevelWindows()列表,等等。
- 它管理应用程序的鼠标光标处理,见setOverrideCursor()
- 它为复杂的会话管理提供支持。这使得应用程序可以在用户注销时优雅地终止,如果不可能终止关闭过程,甚至在将来的会话中保存整个应用程序的状态。查看issession恢复()、sessionId()和commitDataRequest()和saveStateRequest()以获取详细信息。
由于QGuiApplication对象执行了这么多的初始化,所以必须在创建与用户界面相关的其他对象之前创建它。QGuiApplication还处理常见的命令行参数。因此,在对argv的任何解释或修改之前创建它通常是一个好主意。
公有函数
- qreal QGuiApplication::devicePixelRatio() const
返回系统中发现的最高屏幕设备像素比率。这是物理像素和设备独立像素之间的比率。只有你不知道你的目标窗口时,才使用此函数。如果知道目标窗口,则使用QWindow::devicePixelRatio()。
- bool QGuiApplication::isSavingSession() const
如果应用程序当前保存会话,则返回true;否则返回false。当commitDataRequest()和saveStateRequest()被释放时,这是正确的,但是当窗口随后被会话管理关闭时也是如此。
- bool QGuiApplication::isSessionRestored() const
如果应用程序已从较早的会话恢复,则返回true;否则返回false。
- QString QGuiApplication::sessionId() const
返回当前会话的标识。如果这个应用程序从较早的会话恢复,此标识与前一会话中的标识符相同。对于不同应用程序和同一应用程序的不同实例,会话标识符都是唯一的。
- QString QGuiApplication::sessionKey() const
在当前会话中返回密钥。如果应用程序从较早的会话中恢复,此键与前一会话结束时相同。每次保存会话时,会话密钥都会发生改变。如果关闭过程被取消,则在再次关闭会话时将使用另一会话密钥。
静态公有函数
- QWindowList QGuiApplication::allWindows()
返回应用程序中所有的窗口列表,如果程序没有窗口,列表为空。
- applicationDisplayName : QString
QString applicationDisplayName()
void setApplicationDisplayName(const QString &name)
此属性保存该应用程序的用户可见名称。如果没有设置,应用程序显示名称默认为应用程序名称。
- Qt::ApplicationState QGuiApplication::applicationState()
返回应用程序的当前状态。您可以对应用程序状态更改做出响应,以执行诸如停止/恢复cpu密集型任务、释放/加载资源或保存/恢复应用程序数据等操作。
状态如下:
应用状态 | 值 | 说明
———————— | ———- | ——-
Qt::ApplicationSuspended | 0x00000000 | 应用程序即将暂停。当进入这个状态时,应用程序应该保存它的状态,停止所有的活动,并准备好让代码执行停止。暂停时,应用程序可以在没有进一步警告的情况下随时被杀死(例如,当低内存迫使操作系统清除暂停的应用程序时)。
Qt::ApplicationHidden | 0x00000001 | 应用程序隐藏并在后台运行。这是需要进行后台处理的应用程序的正常状态,比如播放音乐,而用户与其他应用程序交互。在进入这个状态时,应用程序应该释放所有图形资源。
Qt::ApplicationInactive | 0x00000002 | 应用程序是可见的,但没有选择在前面。在桌面平台上,这通常意味着用户激活了另一个应用程序。在移动平台上,当操作系统用输入的呼叫或短信来打断用户时,进入这个状态更为常见。在这种状态下,考虑减少cpu密集型任务。
Qt::ApplicationActive | 0x00000003 | 应用程序是可见的,并且被显示在前面。
- void QGuiApplication::changeOverrideCursor(const QCursor &cursor)
更改当前活动的应用程序覆盖当前的光标。注意:如果没有调用setOverrideCursor(),则该函数没有效果。
- QClipboard *QGuiApplication::clipboard()
返回剪切板的交互对象
- desktopFileName : QString
QString desktopFileName()
void setDesktopFileName(const QString &name)
此属性保存此应用程序的桌面条目的基本名称。
这是一个文件名称,没有完整的路径,它是根据freedesktop desktop entry规范来表示这个应用程序的桌面条目。
- bool QGuiApplication::desktopSettingsAware()
如果Qt设置为使用系统的标准颜色、字体等,则返回true;否则返回false。默认是正确的。
- int QGuiApplication::exec()
进入主事件循环并等待直到exit()被调用,然后返回被设置为exit()的值(如果exit()调用exit(),则为0)。
需要调用此函数来启动事件处理。主事件循环从窗口系统接收事件,并将这些事件分派给应用程序小部件。
通常,在调用exec()之前不会发生用户交互。
为了使您的应用程序执行空闲处理,例如,在没有挂起事件的情况下执行一个特殊的函数,使用一个带有0超时的QTimer。可以使用processEvents()实现更高级的空闲处理方案。
我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放入应用程序的main()函数中。这是因为,在某些平台上,QApplication::exec()调用可能不会返回。
- QObject *QGuiApplication::focusObject()
返回当前活动窗口中的QObject,该窗口将是与焦点相关的事件的最终接收方,例如关键事件。
- QWindow *QGuiApplication::focusWindow()
返回接收与焦点相关的事件的QWindow,例如关键事件。
- QFont QGuiApplication::font()
返回应用程序默认的字体
- QInputMethod *QGuiApplication::inputMethod()
返回输入的方法。输入方法返回有关虚拟键盘的状态和位置的属性。它还提供关于当前焦点输入元素位置的信息。
- bool QGuiApplication::isFallbackSessionManagementEnabled()
返回QGuiApplication是否将使用回退会话管理。
默认是正确的。如果这是真的,会话管理器允许用户交互,QGuiApplication将尝试在提交任务()后关闭顶层窗口。如果窗口不能关闭,会话关闭将被取消,应用程序将继续运行。
- Qt::KeyboardModifiers QGuiApplication::keyboardModifiers()
返回键盘上修饰符键的当前状态。当事件队列清空后,将自动更改键盘状态(QEvent::KeyPress和QEvent::KeyRelease事件),当前状态被同步更新。
应该注意的是,这可能并没有反映在调用时在输入设备上所持有的实际的键,而是在上述事件中最后一次报告的修饰符。如果没有密钥,Qt::NoModifier返回。
- QWindow *QGuiApplication::modalWindow()
返回最近显示的模式窗口。如果没有显示模式窗口,则该函数返回零。
模式窗口是一个窗口,它的modality属性设置为Qt::WindowModal或Qt::ApplicationModal。在用户可以继续使用程序的其他部分之前,必须关闭一个模式窗口。模式窗口是在堆栈中组织的。这个函数将返回堆栈顶部的模式窗口。
- Qt::MouseButtons QGuiApplication::mouseButtons()
返回鼠标上的按钮的当前状态。当前状态是同步更新的,因为事件队列清空了会自动改变鼠标状态的事件(QEvent: MouseButtonPress和QEvent::MouseButtonRelease事件)。
- QCursor *QGuiApplication::overrideCursor()
返回活动的应用程序覆盖光标。
如果没有定义应用程序光标,则该函数返回0。
- QPalette QGuiApplication::palette()
返回默认的应用程序调色板。
- QFunctionPointer QGuiApplication::platformFunction(const QByteArray &function)
从平台插件匹配函数返回一个函数指针。
- platformName : const QString
QString platformName()
此属性包含底层平台插件的名称。QPA平台插件位于qtbase\src\plugins\platform中。支持如下平台:
- android
- cocoa(macOS)
- directfb
- eglfs(平台插件,它在EGL和OpenGL ES 2.0之上运行Qt5应用程序,而没有实际的窗口系统)
- ios (也可以被使用tvOS)
- kms(一个使用内核modesetting和DRM(直接呈现管理器)的实验性平台插件)
- linuxfb
- minimal (最小化是一个例子,可以使用该插件在没有GUI的环境中运行GUI应用程序)
- minimalegl(插件例子)
- offscreen
- openwwfd
- qnx
- windows
- xcb(普通桌面Linux平台上使用的X11插件)
- QPlatformNativeInterface *QGuiApplication::platformNativeInterface()
返回平台的本机接口,用于平台特定功能。
- QScreen * const
QScreen primaryScreen()
信号:
void primaryScreenChanged(QScreen screen)
此属性保存应用程序的主(或默认)屏幕。
这将是最初显示QWindows的屏幕,除非另有说明。
- Qt::KeyboardModifiers QGuiApplication::queryKeyboardModifiers()
查询并返回键盘上修饰符键的状态。与keyboardmodifier不同,该方法返回在调用该方法时保存在输入设备上的实际密钥。它不依赖于此进程接收到的按键事件,这使得在移动窗口时检查修饰符成为可能。
注意,在大多数情况下,您应该使用keyboardModifiers(),因为它包含了修饰符的状态,因为它包含了当前处理的事件时的状态。
- QList
screens()
返回与应用程序连接的窗口系统相关的所有屏幕的列表。
QScreen类
公有函数
- int QScreen::angleBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b) const
方便函数计算旋转角度,从旋转a到旋转b。
Qt::ScreenOrientation枚举类型指定屏幕可能具有的各种方向,具体如下:
类型 | 值 | 说明
———————— | ———- |——
Qt::PrimaryOrientation | 0x00000000 | 显示的主要取向。
Qt::LandscapeOrientation | 0x00000002 | 景观朝向,显示宽度大于显示高度。
Qt::PortraitOrientation | 0x00000001 | 人像定位,显示高度大于显示宽度,相对于景观顺时针旋转90度。
Qt::InvertedLandscapeOrientation | 0x00000008 | 倒转的景观朝向,相对于景观旋转180度。
Qt::InvertedPortraitOrientation | 0x00000004 | 倒置的人像方向,旋转180度相对于人像。
- availableGeometry : const QRect
QRect availableGeometry() const
信号:
void availableGeometryChanged(const QRect &geometry)
此属性以像素为单位保存屏幕可用的几何图形。
可用的几何图形是不包括窗口管理器保留区域的几何图形,如任务栏和系统菜单。
- availableSize : const QSize
QSize availableSize() const
信号:
void availableGeometryChanged(const QRect &geometry)
此属性以像素为单位保存屏幕的可用大小。
可用的大小是不包括窗口管理器预留区域(如任务栏和系统菜单)的大小。
- availableVirtualGeometry : const QRect
QRect availableVirtualGeometry() const
信号:
void virtualGeometryChanged(const QRect &rect)
此属性保存该屏幕所属的虚拟桌面的可用几何图形。
返回与此屏幕对应的虚拟桌面的可用几何图形。
这是虚拟兄弟姐妹的单个可用几何图形的联合。
- availableVirtualSize : const QSize
QSize availableVirtualSize() const
信号:
void virtualGeometryChanged(const QRect &rect)
此属性保存该屏幕所属的虚拟桌面的可用大小。
返回与此屏幕对应的虚拟桌面的可用像素大小。
这是虚拟兄弟的单个可用几何图形的组合大小。
- depth : const int
int depth() const
此属性保存屏幕的颜色深度
- devicePixelRatio : const qreal
qreal devicePixelRatio() const
信号:
void physicalDotsPerInchChanged(qreal dpi)
此属性保存物理像素和与设备无关的像素之间的屏幕比值。
返回屏幕的物理像素与设备独立像素之间的比率。
普通的数值是1.0在正常显示和2.0在“视网膜”显示。更高的值也是可能的。
- geometry : const QRect
QRect geometry() const
信号:
void geometryChanged(const QRect &geometry)
此属性以像素为单位保存屏幕的几何图形。
- QPixmap QScreen::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1)
创建并返回一个由QRect(x, y, width, height)限制的给定窗口内容所构建的像素图。
参数(x, y)指定窗口中的偏移量,而(宽度、高度)指定要复制的区域。如果宽度为负,函数将所有内容复制到窗口的右边框。如果高度为负,则函数将所有内容复制到窗口的底部。
可以使用QWidget: winId()函数检索窗口系统标识符。使用窗口标识符而不是QWidget的基本原理是启用不属于应用程序、窗口系统框架等的窗口。
- QPlatformScreen *QScreen::handle() const
获取平台屏幕手柄
- bool QScreen::isLandscape(Qt::ScreenOrientation o) const
如果o是横景或倒景,则返回真值的便利函数;否则返回false。
- bool QScreen::isPortrait(Qt::ScreenOrientation o) const
如果o是竖式或倒立式,则返回true的便利函数;否则返回false。
- logicalDotsPerInch : const qreal
qreal logicalDotsPerInch() const
信号:
void logicalDotsPerInchChanged(qreal dpi)
此属性保存每英寸逻辑点或像素的数量。
此值可用于将字体点大小转换为像素大小。
这是一个方便的属性,就是logicalDotsPerInchX和logicalDotsPerInchY属性的平均值。
- logicalDotsPerInchX : const qreal
qreal logicalDotsPerInchX() const
信号:
void logicalDotsPerInchChanged(qreal dpi)
此属性保存水平方向上每英寸逻辑点或像素的数量。
此值用于将字体点大小转换为像素大小。
- logicalDotsPerInchY : const qreal
qreal logicalDotsPerInchY() const
信号:
void logicalDotsPerInchChanged(qreal dpi)
此属性保存垂直方向上每英寸逻辑点或像素的数量。
此值用于将字体点大小转换为像素大小。
- QRect QScreen::mapBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b, const QRect &rect) const
在两个屏幕朝向之间绘制矩形。
- name : const QString
QString name() cons
此属性包含表示屏幕的用户外观字符串。
例如,在X11上,它们对应于XRandr屏幕名称,通常是“VGA1”、“HDMI1”等。
- nativeOrientation : const Qt::ScreenOrientation
Qt::ScreenOrientation nativeOrientation() const
此属性保存本机屏幕定向。
屏幕的本机方向是设备的logo标签以正确的方式出现的方向,或者Qt: PrimaryOrientation(如果平台不支持这个功能的话)。本机方向是硬件的属性,不会改变。
- orientation : const Qt::ScreenOrientation
Qt::ScreenOrientation orientation() const
信号:
void orientationChanged(Qt::ScreenOrientation orientation)
此属性保存屏幕方向。
屏幕方向表示显示的物理方向。例如,移动设备的屏幕方向会根据手持方式而改变。对方向的更改可能会也可能不会触发对屏幕主方向的更改。
对该属性的更改将通过orientationUpdateMask()进行过滤,因此为了接收方向更新,应用程序必须首先调用setOrientationUpdateMask(),并使用希望接收的方向的掩码。
- Qt::ScreenOrientations QScreen::orientationUpdateMask() const
返回当前设置的方向更新掩码。
- physicalDotsPerInch : const qreal
qreal physicalDotsPerInch() const
信号:
void physicalDotsPerInchChanged(qreal dpi)
此属性保存每英寸的物理点或像素个数。
这个值表示屏幕显示的像素密度。根据底层系统提供的信息,价值可能不是完全准确的。
这是一种便利性质它只是物理和物理的平均性质。
- physicalDotsPerInchX : const qreal
qreal physicalDotsPerInchX() const
信号:
void physicalDotsPerInchChanged(qreal dpi)
这个属性包含水平方向上每英寸的物理点或像素的数量。
这个值表示屏幕显示的实际水平像素密度。根据底层系统提供的信息,价值可能不是完全准确的。
- physicalDotsPerInchY : const qreal
qreal physicalDotsPerInchY() const
信号:
void physicalDotsPerInchChanged(qreal dpi)
这个属性包含垂直方向上每英寸的物理点或像素的数量。
这个值表示屏幕显示的实际水平像素密度。根据底层系统提供的信息,价值可能不是完全准确的。
- physicalSize : const QSizeF
QSizeF physicalSize() const
信号:
void physicalSizeChanged(const QSizeF &size)
此属性保存屏幕的物理大小(以毫米为单位)。
物理大小表示屏幕显示的实际物理尺寸。
根据底层系统提供的信息,价值可能不是完全准确的。
- primaryOrientation : const Qt::ScreenOrientation
Qt::ScreenOrientation primaryOrientation() const
信号:
void primaryOrientationChanged(Qt::ScreenOrientation orientation)
此属性保留主屏幕方向。
如果屏幕几何图形的宽度大于或等于它的高度,则主屏幕方向为Qt::LandscapeOrientation方向,否则则为 Qt::PortraitOrientation。当屏幕方向改变时(例如,当显示被旋转时),这个属性可能会改变。但是,这种行为是与平台相关的,通常可以在应用程序清单文件中指定。
- refreshRate : const qreal
qreal refreshRate() const
信号:
void refreshRateChanged(qreal refreshRate)
此属性保存Hz中屏幕的大致垂直刷新速度。
- void QScreen::setOrientationUpdateMask(Qt::ScreenOrientations mask)
设置应用程序感兴趣的接收与此屏幕相关的更新的方向。
- size : const QSize
QSize size() const
信号:
void geometryChanged(const QRect &geometry)
此属性保存屏幕的像素分辨率。
- QTransform QScreen::transformBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b, const QRect &target) const
方便函数,用于计算从定位a定义的坐标系映射到定位b和目标维目标定义的坐标系的变换。
- virtualGeometry : const QRect
QRect virtualGeometry() const
信号:
void virtualGeometryChanged(const QRect &rect)
此属性保存该屏幕所属的虚拟桌面的像素几何。
返回与此屏幕对应的虚拟桌面的像素几何。
这是虚拟桌面的各个几何图形的联合。
- QList
QScreen::virtualSiblings() const
获取屏幕的虚拟桌面。