文档章节

Qt on Android:应用截屏

m
 mulderdragon
发布于 2015/06/20 00:21
字数 658
阅读 77
收藏 1
点赞 0
评论 0

    在桌面平台上,QScreen::grabWindow 可以为你的应用截屏,Android 平台上这个不管用了,不过有替代方法。

    分两种情况来说吧, Qt Widgets 与 Qt Quick。

    插播广告,欢迎关注我的微信订阅号“程序视界”,扫描下方二维码即可:


    程序视界每周更新一到二篇程序员相关的文章,从心出发,漫谈程序员眼中的世界和世界眼中的程序员。

Qt Widgets

    最关键的就是一个函数: QWidget::render ,这个方法可以把一个 QWidget(包含它的孩子们)的内容渲染到一个 QPixmap 上,然后我们用 QPixmap 的 save 方法就可以保存了。

    下面是关键代码:

void Widget::onGrab()
{
    QPixmap *pixmap = new QPixmap(size());
    render(pixmap);
    QString savedPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
    if(savedPath.isEmpty())
    {
        savedPath = QDir::currentPath();
    }
    m_savedPathLabel->setText(savedPath);
    m_savedPathLabel->adjustSize();
    savedPath += "/grabWidgets.png";
    bool ret = pixmap->save(savedPath);
    if(ret)
    {
        m_savedPathLabel->setText("OK."+savedPath);
    }
    else
    {
        m_savedPathLabel->setText("Failed."+savedPath);
    }
}

    onGrab() 方法的前两行以 widget 的大小创建了一个 QPixmap ,然后调用 render 方法。接下来的代码是把图片保存到 Android 设备的默认图片目录下。

Qt Quick

    Qt Quick 应用,都会有一个 QQuickWindow ,而 QQuickWindow 有一个 grabWindow 方法,可以把应用当前窗口的内容保存为图片。

    这个牵涉到 QML 与 C++ 混合编程了,参考我的《Qt Quick核心编程》,或者“Qt Quick 之 QML 与 C++ 混合编程详解”。

C++代码

    头文件 grabber.h :

class Grabber : public QObject
{
    Q_OBJECT
public:
    Grabber(QObject *parent = 0);

    Q_INVOKABLE QString grab(QQuickWindow *w);
};

    源文件 grabber.cpp 里的关键代码:

QString Grabber::grab(QQuickWindow *w)
{
    QImage image = w->grabWindow();
    if(image.isNull()) return QString();
    QString savedPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
    if(savedPath.isEmpty())
    {
        savedPath = QDir::currentPath();
    }
    savedPath += "/grabQML.png";
    bool ret = image.save(savedPath);
    if(ret)
    {
        return savedPath;
    }
    return QString();
}

    另外需要在 main() 函数中设置一个 QmlContext 的属性,代码如下:

Grabber *grabber = new Grabber;
    engine.rootContext()->setContextProperty("grabber", grabber);

    然后我们就可以在 Qml 文件内使用 Grabber 来截图了。

QML代码

    我的测试 QML 文档 main.qml 如下:

import QtQuick 2.2
import QtQuick.Window 2.0
import QtQuick.Controls 1.1

Window {
    id: rootWin;
    visible: true;
    title: qsTr("Hello Grab QML");
    objectName: "rootWin";

    Text {
        text: qsTr("Hello Grab QML");
        color: "blue";
        font.pointSize: 16;
        anchors.centerIn: parent;
    }

    Rectangle {
        anchors.top: parent.top;
        anchors.horizontalCenter: parent.horizontalCenter;
        width: 120;
        height: 120;
        color: "blue";
    }

    Text {
        id: savedPath;
        anchors.left: parent.left;
        anchors.bottom: parent.bottom;
        anchors.bottomMargin: 4;
        color: "red";
        font.pointSize: 12;
    }


    Button {
        id: grab;
        anchors.bottom: savedPath.top;
        anchors.bottomMargin: 4;
        anchors.horizontalCenter: parent.horizontalCenter;
        text: "Grab";
        onClicked: {
            var saved = grabber.grab(rootWin);
            if(saved.length == 0){
                savedPath.text = "Failed!";
            }else{
                savedPath.text= "Ok -" + saved;
            }
        }
    }
}

    我在 grab 按钮的 onClicked 信号处理器内调用 grabber.grab() 来完成截图操作,成功时将路径显示出来。

 

    OK,就这么多了。

    想了解更多 Qt on Android 内容,可以参考《Qt on Android核心编程》或“Qt on Android专栏”,想了解更多 Qt Quick(QML)内容,可以参考《Qt Quick核心编程》或“Qt Quick专栏”。

© 著作权归作者所有

共有 人打赏支持
m
粉丝 1
博文 10
码字总数 0
作品 0
石景山
Qt (5.10.0)for android

Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架,至此实现了全面支持iOS、Android、WP,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。那么如何在...

SmileAgain_ ⋅ 05/14 ⋅ 0

Android文档水印之PDF水印

随着移动终端办公化的普及,在Android手机中阅读文档已经是很普遍的事情了,但是有些文档可能是涉及到一些企业机密与敏感的内容,不希望随意扩散出去。为了防止重要的文档被截屏或者拍照而泄...

sunrongxin.py ⋅ 2017/03/05 ⋅ 0

使用Python制作微信跳一跳半自动外挂+详细注释

思路 1.截取安卓手机当前屏幕图片并复制到Mac。 知识点:ADB工具--截屏命令 2.测量截图中两方块之间的距离。知识点:Matplotlib制图工具 3.根据距离判断手机所需按下的时间。 4.通过鼠标控制...

earth9 ⋅ 04/16 ⋅ 0

Qt:Qt一种开跨平台C++图形用户界面应用程序开发框架简介、安装、使用方法详细攻略——Jason niu

Qt简介、安装、使用方法 Qt 是一个跨平台的 C++图形用户界面库,由挪威 TrollTech 公司于1995年底出品。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象...

qq_41185868 ⋅ 04/20 ⋅ 0

安卓应用安全指南 4.5.3 使用 SQLite 高级话题

安卓应用安全指南 4.5.3 使用 SQLite 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 4.5.3.1 在 SQL 语句的断言中使用通配符...

apachecn_飞龙 ⋅ 03/22 ⋅ 0

Android Flutter 内存机制初探

阿里妹导读:闲鱼技术团队一直在探索如何使用Flutter来统一移动App开发。移动设备上的资源有限,内存使用成了日常开发中的常见问题。那么,Flutter是如何使用内存,又会对Native App的内存带...

b0q8cpra539hafs7 ⋅ 05/23 ⋅ 0

开发者的最佳 GNOME 扩展

扩展给予 GNOME3 桌面环境以非常大的灵活性,这种灵活性赋予了用户在定制化桌面上的优势,从而使他们的工作流程变得更加舒适和有效率。Fedora Magazine 已经介绍了一些很棒的桌面扩展,例如 ...

作者: Shaun Assam ⋅ 04/22 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

《Qt 5.9 C++开发指南》第1章 认识Qt

第1章 认识Qt 1.1 Qt简介 简要介绍了Qt的发展历史和特点。Qt是一套跨平台的应用程序开发类库,支持Windows,Linux,macOS等桌面平台,还支持移动和嵌入式操作系统,如iOS,Embedded Linux,...

hongandyi ⋅ 05/11 ⋅ 0

浅入浅出 Android 安全:第一章 Android

第一章 Android 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 安全架构的理解不仅帮助我了解 Android 的工作原理,而且为我开启了如何构建移动操作系...

apachecn_飞龙 ⋅ 2016/11/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 32分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 51分钟前 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部