标签:qt quick qml qt for android qt on android
在桌面平台上,QScreen::grabWindow 可以为你的应用截屏,Android 平台上这个不管用了,不过有替代方法。
分两种情况来说吧, Qt Widgets 与 Qt Quick。
插播广告,欢迎关注我的微信订阅号“程序视界”,扫描下方二维码即可:
程序视界每周更新一到二篇程序员相关的文章,从心出发,漫谈程序员眼中的世界和世界眼中的程序员。
最关键的就是一个函数: 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);
}
}Qt Quick 应用,都会有一个 QQuickWindow ,而 QQuickWindow 有一个 grabWindow 方法,可以把应用当前窗口的内容保存为图片。
这个牵涉到 QML 与 C++ 混合编程了,参考我的《Qt Quick核心编程》,或者“Qt Quick 之 QML 与 C++ 混合编程详解”。
头文件 grabber.h :
class Grabber : public QObject
{
Q_OBJECT
public:
Grabber(QObject *parent = 0);
Q_INVOKABLE QString grab(QQuickWindow *w);
};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();
} Grabber *grabber = new Grabber;
engine.rootContext()->setContextProperty("grabber", grabber);我的测试 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;
}
}
}
}
OK,就这么多了。
想了解更多 Qt on Android 内容,可以参考《Qt on Android核心编程》或“Qt on Android专栏”,想了解更多 Qt Quick(QML)内容,可以参考《Qt Quick核心编程》或“Qt Quick专栏”。
标签:qt quick qml qt for android qt on android
原文地址:http://blog.csdn.net/foruok/article/details/45582915