【问题标题】:QML FileDialog set title from C++ codeQML FileDialog 从 C++ 代码设置标题
【发布时间】:2017-10-04 00:49:04
【问题描述】:

我有以下 qml 文件:

import QtQuick 2.2
import QtQuick.Dialogs 1.2

FileDialog 
{
 property string myTitle: "Select file to open"
 property string myfilter: "All files (*)"

 id: fileDialog
 objectName: "fileDialogObj"
 title: myTitle
 folder: shortcuts.home
 sidebarVisible : true
 nameFilters: [ myfilter ]
 onAccepted: 
 {
  close()
 }
 onRejected: 
 {
  close()
 }
 Component.onCompleted: visible = true
}

我想从 C++ 代码中设置 title 属性。我的代码看起来像:

QQmlEngine engine;
QQmlComponent component( &engine );
component.loadUrl( QUrl( QStringLiteral( "qrc:/qml/my_file_dialog.qml" ) ) );
QObject* object = component.create();
object->setProperty( "myTitle", "Open file!" );

标题具有属性myTitle的初始值(Select file to open),并且永远不会更改为Open file!

我做错了什么?

更新 我也尝试过直接从 C++ 代码更新标题。

考虑到我有对话框对象,我像这样更新磁贴:

QQmlProperty::write( dialog, "title", "testing title" );

还有这样的:

dialog->setProperty( "title", "testing title" );

文件对话框的属性标题没有设置。

正如@Tarod 在他的回答中提到的,这似乎是一个错误。

还是我错过了什么?

【问题讨论】:

  • 别名:property alias myTitle: fileDialog.title 和 setProperty 怎么样?我假设属性绑定可能会被属性更改破坏,或者没有。别名将强制执行该绑定。

标签: c++ qml qtquick2 filedialog qqmlcomponent


【解决方案1】:

这似乎是一个错误,因为如果我们设置下一个代码可以工作

title = "xxx"

而不是

title = myTitle

此外,您还可以检查其他属性是否已正确更新。 IE。 sidebarVisible

ma​​in.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QQmlProperty>
#include <QDebug>    

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl(QLatin1String("qrc:/main.qml")));
    QObject *object = component.create();

    QObject *fileDialog = object->findChild<QObject*>("fileDialogObj");

    if (fileDialog)
    {
        fileDialog->setProperty("myTitle", "new title");
        fileDialog->setProperty("sidebarVisible", true);
        qDebug() << "Property value:" << QQmlProperty::read(fileDialog, "myTitle").toString();
    } else
    {
        qDebug() << "not here";
    }

    return app.exec();
}

ma​​in.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQml 2.2
import QtQuick.Dialogs 1.2

Item {
    FileDialog
    {
        property string myTitle: fileDialog.title
        property string myfilter: "All files (*)"

        id: fileDialog
        objectName: "fileDialogObj"
        title: "Select file to open"
        folder: shortcuts.home
        sidebarVisible : true
        nameFilters: [ myfilter ]

        onAccepted:
        {
            close()
        }
        onRejected:
        {
            close()
        }
        Component.onCompleted:
        {
            visible = true
        }
        onMyTitleChanged:
        {
            console.log("The next title will be: " + myTitle)
            title = myTitle
        }
    }
}

【讨论】:

  • 我会等待一段时间来澄清这是否是一个错误,然后,如果没有其他反馈,我会接受你的回答:这是一个错误。
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多