Почему в диалоговом окне QFontDialog не происходит фильтрация шрифтов?

Добрый день. Я правильно понимаю, что согласно <a href="https://doc.qt.io/qt-6/qfontdialog.html#FontDialogOption-enum" rel="nofollow">документации</a>, при использовании следующего кода <br/> <pre><code class="cpp">QFontDialog dialog;
dialog.setOption(QFontDialog::MonospacedFonts);
bool ok;
auto font = dialog.getFont(&amp;ok);</code></pre> <br/> в диалоге должны отображаться только моноширинные шрифты? Однако я всегда вижу все системные шрифты, вне зависимости от установленных опций (например, даже если я выставляю пропорциональные шрифты в false). Я использую Qt 6.8.2, MS VS 2022 на Windows 11. Можете объяснить, почему это происходит?
  • 6 марта 2025 г. 19:14
Ответы на вопрос 2
Проблема с фильтрацией шрифтов в `QFontDialog`, которую вы описали, может быть связана с несколькими факторами. В первую очередь, важно понимать, как работает фильтрация шрифтов в диалоговом окне шрифтов Qt.

Когда вы устанавливаете опции для `QFontDialog`, такие как `QFontDialog::MonospacedFonts`, это означает, что вы хотите, чтобы диалог показал только моноширинные шрифты. Однако на практике реализация этого фильтра может зависеть от системы и доступных шрифтов.

1. **Проблемы с установкой фильтра**: Убедитесь, что вы правильно вызываете метод `setOption()`. Если вы делаете это перед показом диалогового окна, все должно работать как положено. Однако если вы вызываете это после создания диалогового окна, изменения могут не примениться.

2. **Версия Qt**: Иногда в конкретных версиях Qt могут быть ошибки или несоответствия. Проверьте, нет ли известных ошибок, связанных с `QFontDialog`, в используемой вами версии Qt. Возможно, в более свежих версиях были исправлены проблемы с фильтрацией.

3. **Драйверы и шрифты системы**: В Windows и других операционных системах могут быть различные шрифты, которые могут не поддерживать корректно определенные свойства, такие как моноширинность. Это может повлиять на фильтрацию.

4. **Тестирование на других системах**: Попробуйте запустить тот же код на другой платформе, например, на Linux или macOS, чтобы выяснить, связано ли это с вашей конкретной конфигурацией Windows.

5. **Работа с `getFont()`**: Возможно, что метод `getFont()` возвращает все доступные шрифты, если фильтрация по каким-то причинам не срабатывает. Вам может потребоваться дополнительно проверить, какой шрифт был возвращен, и реализовать свою логику фильтрации, основываясь на свойствах шрифтов.

Если ни один из предложенных шагов не решает проблему, вы также можете рассмотреть возможность создания собственного диалогового окна для выбора шрифта, где вы могли бы реализовать более тонкую настройку и фильтрацию шрифтов, исходя из собственных требований.
Метод QFontDialog::getFont является static 
Его вызов создает объект диалога самостоятельно.
(вызов static метода на объекте скорее всего является ошибкой)

Для задания параметров фильтрации опции можно передать через параметр в расширенной версии этого метода.

#include <QApplication>
#include <QFontDialog>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    {
        bool ok;
        QFont tmp;
        QWidget* parent = nullptr;
        auto font = QFontDialog::getFont(
            &ok
            , tmp
            , parent
            , QStringLiteral("Title")
            , QFontDialog::MonospacedFonts | QFontDialog::DontUseNativeDialog
            );
    }
    return 0;
}
Похожие вопросы