为什么我的窗户没有显示?

时间:2018-05-17 14:26:44

标签: c++ qt qtquick2

我需要写一个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")
    }
}

但它在开始时没有显示(我知道它是透明的,我的意思是抓取窗口没有开始显示)。如果我使用GrabWindowWindow代替ApplicationWindow,那么一切正常,我看到的是透明的全屏窗口。
怎么了?

1 个答案:

答案 0 :(得分:1)

您的GrabWindow未显示,因为当您设置visible属性时,它与使用Window的{​​{1}}属性时的属性不同。

你的只是​​visible的{​​{1}}属性。 visible不会直接实例化QWindow,它会实例化一个私有Qt类Window,它会使用自定义属性覆盖QQuickWindow属性。 它似乎延迟了QQuickWindowImpl以后的实际调用。

因此,我认为visible不是要继承的。您可以尝试在QWindow::setVisible中执行QQuickWindow,但我不确定它是否可以解决您的问题。

我建议您不要创建新类型并将其传递给现有visible = true

可能的API可能是:

Component.onCompleted

QQuickWindow