为什么我的窗口不显示?

Why does my window not show?

本文关键字:显示 窗口 我的 为什么      更新时间:2023-10-16

我需要写一个GrabWindow,所以我从QQuickWindow派生了我的类GrabWindow

#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")
}
}

但它不会在开始时显示(我知道它是透明的,我的意思是抓取窗口不会开始显示)。如果我不使用WindowApplicationWindow而不是GrabWindow那么一切正常,我看到的是一个透明的全屏窗口。
怎么了?

不会显示您的GrabWindow,因为当您设置visible属性时,它与使用Windowvisible属性时不同。

你的只是QWindowvisible财产.Window不直接实例化QQuickWindow,而是实例化一个私有的Qt类QQuickWindowImpl,该类用自定义属性覆盖visible属性。 它似乎延迟了稍后QWindow::setVisible的实际呼叫。

因此,我不认为QQuickWindow是要继承的。您可以尝试在Component.onCompleted中执行visible = true,但我不确定它是否会解决您的问题。

相反,我建议您不要子类化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
}
}