Qt 如何使用QML创建初始屏幕

Qt 如何使用QML创建初始屏幕,qt,qml,splash-screen,Qt,Qml,Splash Screen,我正在尝试使用QT开发一个android应用程序。 我想在应用程序开始时显示一个启动屏幕。启动屏幕将在那里停留2秒钟,然后将显示应用程序的主页。 为此,我创建了2.qml文件 Splash.qml import QtQuick 2.9 import QtQuick.Controls 2.2 import QtQuick.Window 2.3 Window { id: window visible: true width: Screen.width height:

我正在尝试使用QT开发一个android应用程序。 我想在应用程序开始时显示一个启动屏幕。启动屏幕将在那里停留2秒钟,然后将显示应用程序的主页。 为此,我创建了2.qml文件

Splash.qml

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Window 2.3

Window {
    id: window
    visible: true
    width: Screen.width
    height: Screen.height
    signal timeout

    Image {
        id: image
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
        width: 300
        height: 300
        source: "qrc:/../Desktop/photo_2018-03-21_19-53-06.jpg"
    }

    Text {
        id: text1
        y: image.height + image.y + 20
        text: qsTr("@startimeahmet Presents")
        anchors.horizontalCenter: parent.horizontalCenter
        font.pixelSize: 25
    }

    Timer {
        interval: 2000; running: true; repeat: false
        onTriggered: {
            visible = false
            window.timeout()
        }
    }
}
main.qml

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Window 2.3

ApplicationWindow {
    id: root
    visible: false
    width: Screen.width
    height: Screen.height

    Splash {
        onTimeout: root.visible = true
    }
}
但这不起作用。在此方面的任何帮助都将不胜感激

p、 正如我所说的,我将Qt5.11.1与QtCreator 4.6.2一起使用,因为你的应用程序窗口是不可见的,它的所有子项也不可见,包括你的启动窗口。所以Splash和ApplicationWindow至少应该是兄弟。但更好的解决方案是使用@Mohammad Kanan已经注意到的Loader。在这种情况下,还有一个额外的优点-每个窗口将在适当的时间初始化,并在使用后卸载。例如:

import QtQuick 2.11
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Loader {
    id: loader
    Component {
        id: splash
        Window {
            id: splashWindow
            signal timeout()
            width: 300
            height: 200
            modality: Qt.ApplicationModal
            flags: Qt.SplashScreen
            color: "#DEDEDE"
            ProgressBar {
                id: progress
                anchors {
                    left: parent.left
                    right: parent.right
                    bottom: parent.bottom
                }
                value: 0
                to : 100
                from : 0
            }
            Timer {
                id: timer
                interval: 50
                running: true
                repeat: true
                onTriggered: {
                    progress.value++;
                    if(progress.value >= 100) {
                        timer.stop();
                        splashWindow.timeout();
                    }
                }
            }
        }
    }

    Component {
        id: root
        Window {
            id: rootWindow
            width: 800
            height: 600
        }
    }

    sourceComponent: splash
    active: true
    visible: true
    onStatusChanged: {
        if (loader.status === Loader.Ready)
            item.show();
    }

    Connections {
        id: connection
        target: loader.item
        onTimeout: {
            connection.target = null;
            loader.sourceComponent = root;
        }
    }
}
正如我所说的,因为ApplicationWindow是不可见的,它的所有子项也不可见,包括您的splash窗口。所以Splash和ApplicationWindow至少应该是兄弟。但更好的解决方案是使用@Mohammad Kanan已经注意到的Loader。在这种情况下,还有一个额外的优点-每个窗口将在适当的时间初始化,并在使用后卸载。例如:

import QtQuick 2.11
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Loader {
    id: loader
    Component {
        id: splash
        Window {
            id: splashWindow
            signal timeout()
            width: 300
            height: 200
            modality: Qt.ApplicationModal
            flags: Qt.SplashScreen
            color: "#DEDEDE"
            ProgressBar {
                id: progress
                anchors {
                    left: parent.left
                    right: parent.right
                    bottom: parent.bottom
                }
                value: 0
                to : 100
                from : 0
            }
            Timer {
                id: timer
                interval: 50
                running: true
                repeat: true
                onTriggered: {
                    progress.value++;
                    if(progress.value >= 100) {
                        timer.stop();
                        splashWindow.timeout();
                    }
                }
            }
        }
    }

    Component {
        id: root
        Window {
            id: rootWindow
            width: 800
            height: 600
        }
    }

    sourceComponent: splash
    active: true
    visible: true
    onStatusChanged: {
        if (loader.status === Loader.Ready)
            item.show();
    }

    Connections {
        id: connection
        target: loader.item
        onTimeout: {
            connection.target = null;
            loader.sourceComponent = root;
        }
    }
}

使用本机Android启动屏幕

在android/res/drawable/splash.xml中创建splash资源。差不多 在android/AndroidManifest.xml中找到activity元素并添加以下属性:android:theme=@style/AppTheme 添加以下内容:

<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
<meta-data android:name="android.app.splash_screen_sticky" android:value="true"/>
在you.pro文件中添加

QT+=雄配子

<>你的C++代码在你的应用程序准备好时添加这行:< /P> QtAndroid::hideSplashScreen250

享受吧


使用本机Android启动屏幕

在android/res/drawable/splash.xml中创建splash资源。差不多 在android/AndroidManifest.xml中找到activity元素并添加以下属性:android:theme=@style/AppTheme 添加以下内容:

<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
<meta-data android:name="android.app.splash_screen_sticky" android:value="true"/>
在you.pro文件中添加

QT+=雄配子

<>你的C++代码在你的应用程序准备好时添加这行:< /P> QtAndroid::hideSplashScreen250

享受吧


嗨,我不认为这是一个重复的问题。你提到的那个问题是一个非常古老的问题,对任何事情都没有帮助@MohammadKananI没有将您的问题标记为重复,虽然还有其他问题与您的问题类似,但只需在StakOverFlow上搜索一下即可。如何从main.QML加载QML文件请相信我,我做到了。。但我需要有人看看我的代码,找出哪里出了问题。我花了两天多的时间试图弄明白这一点@MohammadKananI猜想你们不能展示窗户,它是看不见的孩子。一个重复的嗨,我不认为这是一个重复的问题。你提到的那个问题是一个非常古老的问题,对任何事情都没有帮助@MohammadKananI没有将您的问题标记为重复,虽然还有其他问题与您的问题类似,但只需在StakOverFlow上搜索一下即可。如何从main.QML加载QML文件请相信我,我做到了。。但我需要有人看看我的代码,找出哪里出了问题。我花了两天多的时间试图弄明白这一点@MohammadKananI猜测你不能展示窗户,这是看不见的孩子。似乎是一条路要走!QtAndroid::hideSplashScreen250;这是否不需要通过QAndroidJniObject就可以执行本机android调用?是的,它是androidextras模块中提供的Qt API@弗拉维奥多迪尼QtAndroid::hideSplashScreen250;这句话不管用。我使用Qt5.15.1。这样做,唯一的问题是传递到hideSplashScreen的延迟触发的透明度淡出动画没有正确处理。坚实的背景和标志动画不同步。似乎是要走的路!QtAndroid::hideSplashScreen250;这是否不需要通过QAndroidJniObject就可以执行本机android调用?是的,它是androidextras模块中提供的Qt API@弗拉维奥多迪尼QtAndroid::hideSplashScreen250;这句话不管用。我使用Qt5.15.1。这样做,唯一的问题是传递到hideSplashScreen的延迟触发的透明度淡出动画没有正确处理。实心bg和徽标动画不同步。