Почему мое окно не отображается? - PullRequest
0 голосов
/ 17 мая 2018

Мне нужно написать 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, то все работает отлично, я вижу прозрачное полноэкранное окно.
Что не так?

1 Ответ

0 голосов
/ 17 мая 2018

Ваш GrabWindow не отображается, поскольку при настройке свойства visible он не такой, как при использовании свойства Window visible.

У вас просто visibleсвойство QWindow.Window не создает непосредственно экземпляр QQuickWindow, он создает частный класс Qt QQuickWindowImpl, который переопределяет свойство visible на собственный.Кажется, это задерживает фактический вызов QWindow::setVisible в более позднее время.

Поэтому я не думаю, что QQuickWindow предназначен для наследования.Вы можете попробовать сделать visible = true в своем Component.onCompleted, но я не уверен, что это решит вашу проблему.

Вместо этого я бы посоветовал вам не создавать подклассы QQuickWindow, а просто создать новый тип и передатьэто существующий Window.

Возможные API могут быть:

Window {
    id: myWindow
    //...
    MouseArea {
        anchors.fill: parent
        onClicked: WindowGrabber.grab(myWindow, path) //singleton type
    }
}

или

Window {
    id: myWindow
    //...
    WindowGrabber { // regular type
        id: windowGrabber
        window: myWindow
    }
    MouseArea {
        anchors.fill: parent
        onClicked: windowGrabber.grab(path) // you could even add a path property in WindowGrabber and not have it as a function parameter if that makes sense for your use case
    }
}
...