簡體   English   中英

QQuickView 在調用 show 時顯示一個空的 window

[英]QQuickView shows an empty window when calling show

我仍在嘗試使用 QML + c++ 來學習編碼,所以這個代碼片段的本質可能聽起來有點不切實際。 我正在嘗試編寫一個繼承自QQuickView並加載qml文件的 class 。 這是我的 header 文件:

#ifndef FORMLOGIN_H
#define FORMLOGIN_H

#include <QQuickView>


class FormLogin:public QQuickView
{
public:
    FormLogin();
public slots:
    void myHide();
};

這是它的實現:

#include "formlogin.h"
#include<QCoreApplication>
#include<QQmlEngine>
FormLogin::FormLogin()
{
    this->setSource(QUrl("qrc:/main.qml"));
    QObject::connect(this->engine(),&QQmlEngine::quit,&QCoreApplication::quit);

}
#include "iostream"
using namespace std;
void FormLogin::myHide(){
    cout<<"called"<<endl;
    if(this->isVisible()){
        this->hide();
    }else{
        this->show();
    }
}

這是我的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include"formlogin.h"
#include<iostream>
#include<QTimer>
using namespace std;
FormLogin *formLogin;
QTimer *myTimer;
int main(int argc, char *argv[])
{
    //QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    
    formLogin=new FormLogin();
    myTimer=new QTimer();
    myTimer->start(3000);
    QObject::connect(myTimer,&QTimer::timeout,formLogin,&FormLogin::myHide);
    
    return app.exec();
}

我的main.qml看起來像這樣:

import QtQuick 2.0
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import QtGraphicalEffects 1.0
Window {
    Rectangle{
        anchors.fill: parent
        color: "lightblue"
    }   

    title: qsTr("Title")
    width: 450; height: 550
    visible: true
}

現在,您可以從代碼中了解到它有一個連接到myHideQTimer ,它顯示和隱藏我的登錄表單。 以下是我運行應用程序時發生的情況:

  1. 它打開了我在 main.qml 中設計的main.qml
  2. 它會在 3 秒后打開一個空的 window;
  3. 它在 3 秒后隱藏了空的 window 並繼續這種方式。

我個人的期望是它不應該首先顯示我的 QML 表格,它應該等到定時器的超時信號發出。 然而,它首先顯示正確的 QML window 然后它開始顯示奇怪的空 window 每次調用this->show時。 現在是我提問的時候了:

  1. 為什么它顯示我的 QML window 而沒有“formLogin->show()”?
  2. 這個空的 window 是什么?
  3. 為什么我不能隱藏我的主 window?

解釋

問題是因為 QQuickView 需要一個項目作為根,而不是 Window。

問題是因為 QQuickView 需要一個元素作為根,而不是 window。 您的程序執行以下操作:

  1. 當您啟動 window 時,可見的是 QML
  2. 然后出現QQuickView window
  3. 在它隱藏 QQuickView 並通過第 2 步之后。

步驟 1 和 2 分別回答您的問題 1 和 2。 對於問題 3,答案是您只隱藏了第二個 window。

QQmlApplicationEngine 文檔中指出了這一點:

與 QQuickView 不同,QQmlApplicationEngine 不會自動創建根 window。 如果您使用 Qt Quick 中的視覺項目,則需要將它們放置在 Window 內。

解決方案

所以有2個選項:

  • 或將 Window 替換為項目:

     import QtQuick 2.0 Rectangle{ anchors.fill: parent color: "lightblue" }
     #include "formlogin.h" #include<QCoreApplication> #include<QQmlEngine> #include <iostream> FormLogin::FormLogin() { setSource(QUrl("qrc:/main.qml")); connect(engine(), &QQmlEngine::quit, &QCoreApplication::quit); setTitle("Title"); resize(450, 550); } void FormLogin::myHide(){ std::cout << "called" << std::endl; setVisible(;isVisible()); }
     #include <QGuiApplication> #include <QTimer> #include "formlogin.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); FormLogin formLogin; QTimer myTimer; myTimer.start(3000); QObject::connect(&myTimer, &QTimer::timeout, &formLogin, &FormLogin::myHide); return app.exec(); }
  • 或者使用 QQmlApplicationEngine 代替 QQuickView

加:

如果您想從 QML 修改 window,那么您有 2 個選項:

  1. 或者在 C++ 插槽中實現邏輯並從 QML 調用它。

  2. 或使用 setContextProperty 將 window 導出到 QML

     FormLogin::FormLogin() { rootContext()->setContextProperty("window", this); setSource(QUrl("qrc:/main.qml")); connect(this->engine(),&QQmlEngine::quit,&QCoreApplication::quit); setTitle("Title"); resize(450, 550); }
     import QtQuick 2.0 Rectangle{ id: root anchors.fill: parent color: "lightblue" Component.onCompleted: { window.flags = (window.flags | Qt.CustomizeWindowHint | Qt.FramelessWindowHint) & ~Qt.WindowTitleHint // window.showMaximized() } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM