Qml中的FileDialog在Release中不起作用

Posted

技术标签:

【中文标题】Qml中的FileDialog在Release中不起作用【英文标题】:FileDialog in Qml not working in Release 【发布时间】:2018-03-08 17:00:31 【问题描述】:

我正在与Qt Quick Control 2 合作项目。 当我尝试在调试模式下运行我的软件时,FileDialog.qml 会完美打开,但是当我将其部署为发布模式时它不起作用。

这是我的代码:

import QtQuick 2.4 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.3 
import QtQuick.Dialogs 1.0 

// File Dialog to browse 
FileDialog  
    id: openDialog 
    title: "Please Select An Image" 
    folder: shortcuts.pictures 
    nameFilters: ["Image files (*.BMP)"] 
    modality: Qt.NonModal 
    selectExisting: true 

    /*
     * do my stuff
    */

【问题讨论】:

不起作用是什么意思? 事实上它在另一台电脑上不起作用。当我在我的电脑上执行我的发布时,它工作正常,但在另一台电脑上,它不起作用 FileDialog 是 QtQuick.Controls 1 版本中的一个类型。你是否已经部署了相应的 QML/Quick 包和你的发布二进制文件? 【参考方案1】:

这是我的 Js 函数,它调用 FileBrowse.qml(参数中的文件)。 我在其他视图中这样调用这个函数:

JsCommonCall.openFileDialog("frameFileBrowse.qml",2)


function openFileDialog(file,
                        parentCalled) 
    _component = Qt.createComponent(file);
    _popUp = _component.createObject(windowsMain,  "x": offsetPopUpCreate,
                                                    "y": offsetPopUpCreate,
                                                    "parentCall":parentCalled);
    if(_popUp !== null)
        _popUp.open()

这是我的文件浏览器

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.0

// File Dialog to browse
FileDialog 
    id: openDialog
    title: "Please Select An Image"
    folder: shortcuts.home
    nameFilters: ["Image files (*.BMP)"]
    selectFolder: true 
    // variables 
    property int parentCall; 

    onAccepted: 
        imgCurrentCam1.source = openDialog.fileUrl;
        openDialog.close()
    


    onRejected: 
        openDialog.close()
    

【讨论】:

【参考方案2】:

这对我有用

FileDialog 
    id: fdExport
    title: qsTr("File name")
    folder: shortcuts.home
    selectFolder: true
    onAccepted: 

    

然后运行

    fdExport.open()

请尝试离开

modality: Qt.NonModal 

来自您的代码。

【讨论】:

我尝试了,但它不起作用。正如我之前所说,我认为这不是代码问题,而是 .dll 问题,因为,当我在另一台 PC 上部署我的软件时,它不起作用,但在我的 PC 中却可以正常工作。谢谢你给我你的意见 有人可以帮我吗? 好的,知道这一点很重要。请查看您如何共享您的应用程序。当我为 Windows 发布 Qml 应用程序时,我通常将 Qt 框架中的完整 Qml 文件夹放在 exe 路径中。此外,我通常将所有 Qt dll 放在 exe 路径中,因为无法从 qml 源代码中知道将使用哪些 dll。最后bat很重要的是qt.conf文件。请尝试将完整的 qml 文件夹和所有 dll 添加到您的 exe 安装中,然后在此处回复它是如何消失的。 您好,我将我的应用程序的 .exe 与所有 .dll 和 qt.conf 以及其他 .dll 一起放入 Qt 框架 (Qt/5.9/mingwXXX/bin) 但它在另一台 PC 中不起作用. 好的,此时您应该分享或发送给我一个有该行为的小项目,以便我验证和解决。可能分辨率在你的眼皮底下,但有点隐藏。【参考方案3】:

我不知道问题出在哪里,但下面的代码在 Windows 机器上是完全可移植的。也在 Linux 中测试过。

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.0

Window 
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    FileDialog 
        id: fdImport
        title: qsTr("File name")
        folder: shortcuts.home
        onAccepted: 
            textEdit.text= fdImport.fileUrls[0]
        
    


    Rectangle 
        id: rectangle
        color: "#ffffff"
        anchors.fill: parent

        Rectangle 
            id: rectangle1
            color: "#ffffff"
            anchors.right: parent.right
            anchors.rightMargin: 8
            anchors.left: parent.left
            anchors.leftMargin: 8
            anchors.bottom: rectangle2.top
            anchors.bottomMargin: 6
            anchors.top: parent.top
            anchors.topMargin: 8

            TextEdit 
                id: textEdit
                text: qsTr("Text Edit")
                anchors.fill: parent
                font.pixelSize: 12
            
        

        Rectangle 
            id: rectangle2
            y: 441
            width: 128
            height: 32
            color: "#ffffff"
            anchors.left: parent.left
            anchors.leftMargin: 8
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 7

            MouseArea 
                id: mouseArea
                anchors.fill: parent
                onClicked: 
                    fdImport.open()
                

                Text 
                    id: text1
                    text: qsTr("Click me!")
                    horizontalAlignment: Text.AlignHCenter
                    verticalAlignment: Text.AlignVCenter
                    anchors.fill: parent
                    font.pixelSize: 12
                
            
        
    

qt.conf 文件

[Paths]
Plugins=plugins
Libraries=libs

请记住复制可执行文件夹中的所有 dll(发布),以及 qml 和 plugins 文件夹。

【讨论】:

MODE DEBUG : 消息来自 OUTPUT 当我单击浏览按钮时: ------>>>>ShellStreams: AttachShellStreams: InitializedTrying to load local resources for LANGID 1036 with Primary LANGID 12 code fr在路径 C:\Program Files (x86)\Common Files\Apple\Internet Services\ShellStreams.resources\fr.lproj\ShellStreamsLocalized.dll 加载的名称法语(通用)资源 DLL 不在资源管理器下运行。不会设置线程 locale11284 506C2510 ENTER: ShellStreamsFolder::ShellStreamsFolder pidl = 1f50e04fd020ea3a6910a2d8802b30309d140 -> 2e80853fd6f0ec379740b3d61b4a891711800 ->【参考方案4】:

一个奇怪但可能的原因是防病毒:我的 FileDialog 也没有打开,整个 QML 应用程序挂起,而 AV 处于活动状态。

【讨论】:

以上是关于Qml中的FileDialog在Release中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 FileDialog 时在 QML 中循环

过滤器在 FileDialog 中不起作用

QML 文件对话框(选择文件夹)

如何从 PySide 访问 QML\QtQuick 控件?

对于 QML,为啥 LayoutMirroring 在 Slider 中不起作用?

来自 C++ 的 QStandardItemModel 在 QtQuick / QML TableView 中不可见