Обнаружение недостающих ресурсов в таблицах стилей QT - PullRequest
1 голос
/ 05 октября 2010

Я использую таблицы стилей QCSS в QT для оформления нескольких кнопок с изображениями из системы ресурсов QT:

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

Это прекрасно работает, но мне бы очень хотелось написать предупреждение в наши журналы, если не удалось найти файл изображения, указанный в CSS (и кнопка, таким образом, обнажена). Есть ли способ отловить такие ошибки?

Ответы [ 3 ]

2 голосов
/ 06 октября 2010

Полагаю, вы можете сделать это так:

  • Подробнее о QAbstractFileEngine и QAbstractFileEngineHandler классах.
  • Расширить собственную реализацию Qt, QFSFileEngine . Я считаю, что он также обрабатывает пространство имен ":".
  • Переопределить метод QAbstractFileEngine::open().
  • Зарегистрируйте свой движок, используя собственный QAbstractFileEngineHandler. Метод create() должен проверить имя файла, чтобы увидеть, читается ли оно из файла ресурсов.

Не проверял, но я думаю, что это должно работать. Код:

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;
}

Edit.

Это не будет работать. Файловая система ресурсов «:» обрабатывается частным файловым механизмом с именем QResourceFileEngine , а не QFSFileEngine.

2 голосов
/ 10 июля 2012

Основываясь на ответе @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;
};
1 голос
/ 05 октября 2010

Возможно, что Qt вызовет одну из своих функций сообщений, когда что-то подобное произойдет (хотя я точно не знаю).Если это произойдет, вы можете установить функцию обработки сообщений и добавить некоторые или все сообщения в ваш файл журнала.Некоторая информация об этом содержится в документации для qInstallMsgHandler.

...