文档章节

Qt on Android:应用截屏

m
 mulderdragon
发布于 2015/06/20 00:21
字数 658
阅读 87
收藏 1

    在桌面平台上,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专栏”。

本文转载自:http://blog.csdn.net/foruok/article/details/45582915

共有 人打赏支持
m
粉丝 1
博文 10
码字总数 0
作品 0
石景山
私信 提问
Android 开发中,与屏幕有关的三个小众知识

宽屏适配、禁止截屏和保持屏幕常亮,这三个与屏幕有关的 Android 开发小众知识,说不定什么时候就派上用场。 宽屏适配 越来越多的手机厂商趋向于全面屏设计,比如今年出厂的 18.5:9 屏幕比例...

亦枫
10/29
0
0
让Qt应用程序跑在Android上

让Qt应用程序跑在Android上 Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows、跑linux、跑MAC……如今移动平台android操作系统如此火爆,Qt当然不能放过对android的支持,对...

长平狐
2012/11/28
202
0
如何使用 Eclipse 给 Android 模拟器截屏

如果你是一个Android开发者,想要对你的应用程序进行截屏,用来完成文档,或把它提交到谷歌市场。如今的智能手机都很容易做到,如三星Galaxy系列的Android手机就有屏幕快照。但有些时候,我们...

迷途d书童
2012/09/06
4K
15
如何使用 Eclipse 给 Android 模拟器截屏

如果你是一个Android开发者,想要对你的应用程序进行截屏,用来完成文档,或把它提交到谷歌市场。如今的智能手机都很容易做到,如三星Galaxy系列的Android手机就有屏幕快照。但有些时候,我们...

彭博
2012/11/27
2.6K
1
Android 的 Qt 实现 —— Qt for Android

Android的Qt实现 发表于:2011-2-22 22:37 UTC 罗马尼亚开发者Bogdan Vatra 宣布了Android移动操作系统首个alpha版本的Qt实现。与微软合作的Nokia分支宣布过不会开发一个类似Window Phone的G...

xyxzfj
2011/02/23
11.8K
10

没有更多内容

加载失败,请刷新页面

加载更多

三星Galaxy S10可能会配备TOF 3D摄像头

12月3日消息,据Phone Arena报道,三星Galaxy S10可能会配备TOF 3D摄像头。 Phone Arena报道称三星Galaxy S10一共有五颗摄像头(前置双摄+后置三摄),而5G版本的Galaxy S10后置四颗摄像头,...

问题终结者
26分钟前
8
0
fabric增删改查Mac

备份1.3版本,重新下载1.1版本到fabric文件夹 /opt/gopath/src/github.com/hyperledger/fabric -> /opt/gopath/src/github.com/hyperledger/fabric1.3 新建/opt/gopath/src/github.com/hype......

八戒八戒八戒
55分钟前
9
0
盘点愚人节各大网站彩蛋,谁最爱恶搞?

如今的愚人节俨然已是各品牌宣传了一个重要节日,同时,也成为了各大互联网科技企业凑热闹,比拼创意和策划的节日。跟小编一起看看有哪些有趣的策划吧! Google地图变成吃豆人游戏 每年愚人节...

临江仙卜算子
今天
6
0
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS、ReentrantLock、UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍。Java8 用到了红黑树...

java菜分享
今天
6
0
玩手机与做实验

看过这样一个故事:说的是在二十世纪二十年代初的一个深夜,担任英国剑桥大学卡文迪许实验室主任的卢瑟福来实验室检查,发现一位学生还在做实验。卢瑟福就问他:“你上午做什么了?”学生回答...

Bob2100
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部