在写qml程序的时候,遇到了需要截图的功能,
下面来看看怎么获取控件的截图
首先,所有的可视控件其实都继承了QQuickItem这个类的
所以所有控件都有截图的功能,当然这个只能在c++里实现
首先,定义一个截图类继承public QObject,
#include <QQuickItem>
#include <QQuickItemGrabResult>
要用到上面两个头文件
两个私有变量
QQuickItem *m_grab_item;
QSharedPointer<QQuickItemGrabResult> m_grab_result;
定义这样一个函数,Q_INVOKABLE void setItem(QObject *itemObj); // 保存图片
下面是它的实现,
void qjsontest::setItem(QObject *itemObj)
{
m_grab_item = qobject_cast<QQuickItem*>(itemObj);//获取控件id
m_grab_result = m_grab_item->grabToImage();//获取控件图片
QQuickItemGrabResult * grabResult = m_grab_result.data();//获取数据
connect(grabResult,SIGNAL(ready()),this,SLOT(saveimage()));//这里是必须这样写的,因为调用了ready()这个准备函数,里面做了很多处理
//信号连接
}
定义一个槽函数
private slots:
void saveimage();
下面是它的实现
void qjsontest::saveimage()
{
QImage img = m_grab_result->image();//这里转成图片
qDebug()<<img;
if(img.save("C:\\Users\\Administrator\\Desktop\\assssa.jpg")){
qDebug("ddd");
}
}
qml中使用如下:
onClicked: capIol_vm.setItem(idItem);//idItem是控件id
下面贴出完整代码:.
.h文件
- #ifndef QJSONTEST_H
- #define QJSONTEST_H
- #include <QObject>
- #include <QJsonDocument>
- #include <qDebug>
- #include <QJsonObject>
- #include <QByteArray>
- #include <QJsonArray>
- #include <QQuickItem>
- #include <QQuickItemGrabResult>
- #include <QString>
- #include <qjsonvalue.h>
- #include <qjsondocument.h>
- class qjsontest:public QObject
- {
- Q_OBJECT
- public:
- qjsontest();
- ~qjsontest();
- Q_INVOKABLE void setItem(QObject *itemObj); // 保存图片
- private slots:
- void saveimage();
- private:
- QQuickItem *m_grab_item;
- QSharedPointer<QQuickItemGrabResult> m_grab_result;
- };
- #endif // QJSONTEST_H
.cpp文件
- #include "qjsontest.h"
- #include<QDebug>
- #include<QFile>
- qjsontest::qjsontest()
- {
- }
- qjsontest::~qjsontest()
- {
- }
- void qjsontest::setItem(QObject *itemObj)
- {
- m_grab_item = qobject_cast<QQuickItem*>(itemObj);
- m_grab_result = m_grab_item->grabToImage();
- QQuickItemGrabResult * grabResult = m_grab_result.data();
- connect(grabResult,SIGNAL(ready()),this,SLOT(saveimage()));
- }
- void qjsontest::saveimage()
- {
- QImage img = m_grab_result->image();
- qDebug()<<img;
- if(img.save("C:\\Users\\Administrator\\Desktop\\assssa.jpg")){
- qDebug("ddd");
- }
- }
qml;文件
- import QtQuick 2.7
- import QtQuick.Controls 1.5
- ApplicationWindow {
- visible: true
- width: 640
- height: 480
- title: qsTr("Hello World")
- id:root
- Item{ id: idItem
- width: 200
- height: 200
- x:1; y:1;
- clip: true;
- Rectangle{
- width: 200
- height: 200
- color:"red"
- Button {
- x:5
- y:5
- width: 64
- height: 48
- text: qsTr("calc")
- }
- }
- }
- Button {
- x:300
- y:100
- width: 64
- height: 48
- text: qsTr("normal")
- onClicked: capIol_vm.setItem(idItem);
- }
- }