检测QT样式表中缺少的资源

时间:2010-10-05 06:40:35

标签: qt logging resources stylesheet

我在QT中使用QCSS样式表来使用来自QT资源系统的图像来设置几个按钮:

QFrame#DialogButtonTitle_SaveAsNew
{
  background-image: url(images:DialogButtonTitle_SaveAsNew.png);
}

这很好用,但如果找不到CSS引用的图像文件(并且按钮是裸的),我真的想给我们的日志写一个警告。有没有办法抓住这样的错误?

3 个答案:

答案 0 :(得分:2)

我相信你可以这样做:

尚未测试,但我认为它应该可行。代码:

bool MyEngine::open(QIODevice::OpenMode mode)
{
    bool r = QFSFileEngine::open(mode);
    if (!r) {
        qWarning() << "Failed to open" << fileName();
    }
    return r;
}

QAbstractFileEngine *MyEngineHandler::create(const QString &fileName) const
{
     return fileName.startsWith("images:") ? new MyEngine(fileName) : 0;
}

修改

这不起作用。资源文件系统“:”由名为QResourceFileEngine的私有文件引擎处理,而不是由QFSFileEngine处理。

答案 1 :(得分:2)

根据@andref的答案,我想出了这个,这适用于我(TM):

class LoggingEngineHandler : public QAbstractFileEngineHandler
{
public:
  LoggingEngineHandler()
  : QAbstractFileEngineHandler()
  , m_lookUpInProgress(false)
  , m_lookUpPaths(QRegExp("^(images|meshes|app|sounds):"))
  {
    // empty
  }

  QAbstractFileEngine* create(const QString &fileName) const override
  {
    if (!fileName.contains(m_lookUpPaths))
      return 0;

    if (m_lookUpInProgress)
      return 0;

    m_lookUpInProgress = true;
    QFileInfo info = QFileInfo(fileName);
    m_lookUpInProgress = false;

    if (!info.exists())
    {
      assert(!Utilities::isRunByUser("designer"));
      LOG_WARN("Required resource file does not exist: %1%", QUtil_s(fileName));
    }

    return 0;
  }
protected:
  mutable bool m_lookUpInProgress;

  QRegExp m_lookUpPaths;
};

答案 2 :(得分:1)

当这样的事情发生时,Qt可能会调用其中一个消息函数(虽然我不确定)。如果是,您可以安装消息处理程序函数并将部分或全部消息附加到日志文件中。在documentation for qInstallMsgHandler中有一些关于这样做的信息。