>source

QT에서 QWEBENGINEVIEW를 실행 중이며 QT의 버그가있는 Linux 기계에서 QT (이에 대한 몇 가지 문제가 있음)는 화면이 분리되고 다시 연결되면 렌더링을 고정시킵니다. 그것은 절전 모드로 들어갑니다.

앱은 여전히 ​​괜찮지 만, 더 이상 렌더링이 끝나지 않습니다. 마지막 프레임에 찔 렸습니다. 앱을 실행할 때 표시되는 유일한 오류는 다음과 같습니다.

[14:52:07.809] connector 87 disconnected
QOpenGLFunctions created with non-current context
QPaintDevice::metrics: Device has no metric information
QQuickWidget: Cannot render due to failing makeCurrent()
QQuickWidget: Cannot render due to failing makeCurrent()

이 경고를 던지는 QT의 장소입니다.

//qtdeclarative/src/quickwidgets/qquickwidget.cpp
void QQuickWidgetPrivate::render(bool needsSync)
{
    if (!useSoftwareRenderer) {
#if QT_CONFIG(opengl)
        //createFramebufferObject() bails out when the size is empty. In this case
        //we cannot render either.
        if (!fbo)
            return;
        Q_ASSERT(context);
        if (!context->makeCurrent(offscreenSurface)) {
            qWarning("QQuickWidget: Cannot render due to failing makeCurrent()");
            return;
        }

나는이 장치에서 QT 버전을 변경할 수 없으므로 적절한 충돌 /재시작을 수행하기 위해 앱 내부 에서이 상황을 탐지 할 수있는 안정적인 방법이 있는지 알고 싶습니다. QT 내부에서 QWARNING 메시지를 캡처 할 수있는 방법을 찾을 수 없었고, 이로 인해, 이로 인한 code가 흥미로운 신호를 방출 할 수있게 해주는 code가 표시되지 않습니다.

최후의 수단으로서, 나는 내 앱의 출력을 구문 분석하고 "makeCurrent ()"로 인해 "렌더링 할 수 없지만 렌더링이 냉동 된 내 자신의 앱에서 그것을 감지 할 수없는 것을 밝히지 않습니다. 나는 추가 할 수 있었다QT_FATAL_WARNINGS.환경 변수는 앱이 자동으로 경고에 충돌을 일으키는 환경 변수를 사용하지만 의도하지 않은 충돌을 일으키는 치명적이지 않은 경고가 발생할 수 있음을 두려워합니다.

qinstallmessagehandler가 도움이됩니까? 해당 핸들러에서 특정 문자열을 확인할 수 있습니다.

JarMan2021-09-10 02:05:09

@ jarman 흠, 그것은 그 것처럼 보입니다.이 방법을 찾을 수없는 이유를 알지 못합니다. 특별히 렌더링 오류를 잡을 수있는 방법이없는 한, 나는이 답변으로 갈 수 있다고 생각합니다. 결국 그것을 받아 들일 수 있도록 답변으로 글을 쓸 수 있습니다.

hazelnutek2021-09-09 06:24:18
  • 답변 # 1

    사용할 수 있습니다 qinstallMessageHandler.기본 로깅 메커니즘을 재정의하려면 그리고 거기에서 찾는 특정 문자열에 대한 qwarning 메시지를 확인할 수 있습니다.

    void myMessageOutput(QtMsgType type, const QMessageLogContext &
    context, const QString &
    msg)
    {
        QByteArray localMsg= msg.toLocal8Bit();
        const char *file= context.file ? context.file : "";
        const char *function= context.function ? context.function : "";
        switch (type) {
        case QtWarningMsg:
            fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
            if (localMsg== theBadRenderError) {
                //Do something here
            }
            break;
        ...
        }
    }
    int main(int argc, char **argv)
    {
        qInstallMessageHandler(myMessageOutput);
        QApplication app(argc, argv);
        ...
        return app.exec();
    }
    

  • 이전 Object JavaScript에서 속성에 액세스 할 수 없습니다
  • 다음 python : 세 가지 클래스가있는 결함 탐지를위한 CNN 모델을 작성하는 방법 파이썬에서 한 이미지를 테스트하십시오.