我需要写一个GrabWindow
,因此我从GrabWindow
派生了我的课程QQuickWindow
:
#include <QtQuickWidgets/QtQuickWidgets>
#include <QString>
class GrabWindow : public QQuickWindow {
Q_OBJECT
public:
explicit GrabWindow(QQuickWindow *parent = nullptr);
public slots:
void capture(QString const &path);
};
// .CPP
#include "grab_window.h"
#include <QImage>
GrabWindow::GrabWindow(QQuickWindow *parent) : QQuickWindow(parent) {
}
void GrabWindow::capture(const QString &path) {
QImage img = this->grabWindow();
img.save(path);
}
我在QML中注册后:qmlRegisterType<GrabWindow>("myapp", 1, 0, "GrabWindow");
在我用QML定义窗口之后:
import QtQuick 2.4
import QtQuick.Controls 2.2
import QtQuick.Window 2.3
import myapp 1.0
GrabWindow {
id : translationWindow
width : 1024
height : 768
color: "transparent"
visibility: "FullScreen"
visible: true;
signal capture(string path)
MouseArea {
anchors.fill: parent
onClicked: translationWindow.capture("/home/user/saveTest.jpg")
}
}
但它在开始时没有显示(我知道它是透明的,我的意思是抓取窗口没有开始显示)。如果我使用GrabWindow
或Window
代替ApplicationWindow
,那么一切正常,我看到的是透明的全屏窗口。
怎么了?
答案 0 :(得分:1)
您的GrabWindow
未显示,因为当您设置visible
属性时,它与使用Window
的{{1}}属性时的属性不同。
你的只是visible
的{{1}}属性。
visible
不会直接实例化QWindow
,它会实例化一个私有Qt类Window
,它会使用自定义属性覆盖QQuickWindow
属性。
它似乎延迟了QQuickWindowImpl
以后的实际调用。
因此,我认为visible
不是要继承的。您可以尝试在QWindow::setVisible
中执行QQuickWindow
,但我不确定它是否可以解决您的问题。
我建议您不要创建新类型并将其传递给现有visible = true
。
可能的API可能是:
Component.onCompleted
或
QQuickWindow