【问题标题】:qt how can I reload the resources filesqt如何重新加载资源文件
【发布时间】:2014-07-30 23:59:20
【问题描述】:

我正在为我的新小部件使用样式表。我想添加一个仅用于设计的重新加载按钮。所以我在 Resouces/.../xxx.qrc 文件中添加了一个 stylesheet.txt 作为样式表来应用我的小部件。我有一个 QPushButton 来触发 setStyleSheet() 和一个 QFile 来打开 stylesheet.txt。我想用系统中的默认编辑器编辑程序外的txt。但是我发现资源文件没有刷新,这意味着当我编辑 txt 时,txt 不会在程序中重新加载。知道如何重新加载文件或任何解决方案吗?

【问题讨论】:

    标签: qt qfile qtstylesheets


    【解决方案1】:

    资源在编译时嵌入到二进制文件中。如果您编辑其中一个资源文件,则必须重新构建应用程序。因此,如果您想在不重新编译/重新启动的情况下动态更改样式,只需从外部文件加载样式表,而不是从资源加载。

    【讨论】:

      【解决方案2】:

      来自 Qt 文档:

      “Qt 资源系统是一种独立于平台的机制,用于将二进制文件存储在应用程序的可执行文件中。如果您的应用程序总是需要一组文件(图标、翻译文件等)并且您不想冒丢失文件的风险。”

      资源存储在二进制文件中,只有在重建应用程序时才能更新它们。使用其他文件加载您的样式表。

      【讨论】:

      • 可以将资源编译成RCC格式的外部文件。因此无需重新编译应用程序二进制文件。
      【解决方案3】:

      一般建议:在调试/设计期间不要将资源放在 .qrc 中。我建议改用QDir::setSearchPaths

          void Application::setDirs()
          {
      #ifdef QT_DEBUG
              QDir dir( QGuiApplication::applicationDirPath() );
              dir.cd( "C:/DotaClient" );
              QDir::setSearchPaths( "qml", QStringList( dir.absolutePath() ) );
      #else
              QDir::setSearchPaths( "qml", QStringList( ":/DotaClient/" ) );
      #endif
          }
      

      访问:

      m_mainView->setSource( QUrl( "qml:Root/Root.qml" ) );
      

      或者类似 QSS 中的background-image:url(images:Root/root_bg.png);

      在这种情况下,文件Root.qml 将在调试版本中查看C:/DotaClient/Root/Root.qml(可能动态重新加载),在发布版本中查看:/DotaClient/Root/Root.qml(在资源中)。

      【讨论】:

      • 泰。工作正常:) 顺便说一句,我看到了动态资源文件的 rcc 解决方案。也不错吗?
      • 是的。可以创建命令文件(cmd / bat / sh)来运行用于重建资源的脚本。但是您必须通过QResource 类手动重新加载它们。见文档:qt-project.org/doc/qt-4.8/rcc.html
      猜你喜欢
      • 2021-07-25
      • 2012-12-13
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多