Qt 实现功能丰富的截屏工具

Qt实现的一个截屏,并且可画线、画矩形、画圆、进行编辑,保存。 使用了开源的Qt全局热键,主要使用QxtGlobalShortcut类文件实现的。 源码: 使用Qt5.6.1_MinGW编译通过。 c.29

最近在研究 Qt 开发,实现了一个超有趣的截屏小工具,不仅能截屏,还能在截屏上进行画线、画矩形、画圆以及编辑操作,最后还能保存,非常实用。而且用到了开源的 Qt 全局热键,主要借助 QxtGlobalShortcut 类文件来达成这一酷炫功能。源码基于 Qt5.6.1_MinGW 编译通过。

实现思路

  1. 截屏功能:通过获取屏幕设备上下文,将屏幕内容绘制到一个 QPixmap 上,这样就实现了截屏。
cpp 复制代码
QPixmap captureScreen() {
    QPixmap pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
    return pixmap;
}

这段代码很简洁,QPixmap::grabWindow(QApplication::desktop()->winId()) 直接抓取了整个桌面窗口的内容,并返回一个 QPixmap 对象,这个对象就代表了截取的屏幕图像。

  1. 绘图操作:利用 QPainter 类来实现画线、画矩形、画圆等操作。以画直线为例:
cpp 复制代码
void drawLine(QPixmap &pixmap, QPoint start, QPoint end) {
    QPainter painter(&pixmap);
    painter.setPen(QPen(Qt::red, 2));
    painter.drawLine(start, end);
}

这里创建了一个 QPainter 对象,传入要绘制的 QPixmap。设置画笔为红色,宽度为 2,然后调用 drawLine 方法,从起始点 start 画到终点 end 。画矩形和画圆的操作类似,只是调用不同的 QPainter 方法,比如画矩形用 drawRect ,画圆用 drawEllipse

  1. 编辑功能:可以对绘制的图形进行移动、删除等编辑。这部分实现稍微复杂点,需要记录每个图形的属性和位置等信息。比如,为了移动一个矩形,我们需要重新计算它的左上角顶点位置,然后重新绘制。
  1. 保存功能 :使用 QPixmapsave 方法将编辑后的图片保存到指定路径。
cpp 复制代码
void savePixmap(const QPixmap &pixmap, const QString &path) {
    pixmap.save(path);
}

这里传入要保存的 QPixmap 和保存路径 pathsave 方法会自动根据路径的文件后缀,选择合适的图片格式进行保存。

Qt 全局热键的使用

这部分借助了 QxtGlobalShortcut 类文件。首先要引入相关头文件:

cpp 复制代码
#include "qxtglobalshortcut.h"

然后在代码中创建一个全局热键实例,比如设置截屏的热键为 Ctrl + Shift + S

cpp 复制代码
QxtGlobalShortcut *shortcut = new QxtGlobalShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S), this);
connect(shortcut, SIGNAL(activated()), this, SLOT(takeScreenshot()));

这里创建了一个 QxtGlobalShortcut 对象,指定了热键组合 Ctrl + Shift + S ,并连接了 activated 信号到 takeScreenshot 槽函数,当按下这个热键组合时,就会触发截屏操作。

总的来说,通过这些功能的组合,打造出了一个功能齐全的截屏工具。希望这篇博文能给同样在研究 Qt 开发的小伙伴一些启发。

相关推荐
我命由我123455 小时前
Jetpack Compose - @Preview 注解
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我123451 天前
Android 控件 - CardView(快速实现圆角)
android·java·java-ee·kotlin·android studio·android-studio·android runtime
我命由我123451 天前
Android Drawable - gradient
android·java·java-ee·kotlin·android studio·android-studio·android runtime
木由里予6 天前
TEE(Trusted Execution Environment)技术详解
java·linux·开发语言·网络·嵌入式硬件·android-studio
我命由我123457 天前
Kotlin 面向对象 - 枚举排序
android·java·开发语言·java-ee·kotlin·android studio·android-studio
我命由我123458 天前
SQLite 数据库参数数量超限导致的崩溃问题:SQLiteException: too many SQL variables
java·数据库·sql·java-ee·sqlite·android-studio·android runtime
我命由我1234512 天前
Jetpack Room - TypeConverter
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我1234513 天前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio
我命由我1234515 天前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我1234515 天前
Android 在构建过程中,发现有两个依赖库都包含了相同路径的资源文件
android·java·开发语言·java-ee·kotlin·android-studio·android runtime