LINUX.ORG.RU

Окно QFontDialog застывает на Qt 6.7

 


0

2

Такой код создаёт диалоговое окно, которое не реагирует на нажатие кнопок ни мышь ни клавиатурой:

#include <QApplication>
#include <QTextEdit>
#include <QFontDialog>

int main(int argv, char **args)
{
    QApplication app(argv, args);

    QTextEdit textEdit;

    QFontDialog dlg(&textEdit);
    QFontDialog::FontDialogOptions opt;
    dlg.setOptions(opt);
    dlg.setCurrentFont(QFont("Times", 12));

    if (dlg.exec() == QFontDialog::Accepted)
        textEdit.append("ok");
    else
        textEdit.append("false");

    textEdit.append(dlg.selectedFont().family() + ", " +
                    QString::number(dlg.selectedFont().pointSizeF()));

    textEdit.show();

    return app.exec();
}

Само зависание происходит на вызове метода dlg.exec(). При этом ошибка не проявляется в Windows и/или на Qt 5.

★★★★

Ответ на: комментарий от unC0Rr

В Qt 5 всё работало.

Ну и основная программы была больше, я просто выписал упрощённый пример, демонстрирующий ошибку. Более того, так устроена их функция getFont().

Возможно что это баг Qt?

keeper_b ★★★★
() автор топика
Последнее исправление: keeper_b (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

https://doc.qt.io/qt-6/qapplication.html#exec

Generally, no user interaction can take place before calling exec(). As a special case, modal widgets like QMessageBox can be used before calling exec(), because modal widgets call exec() to start a local event loop.

Ну и судя по документации QFontDialog как раз и использует локальный event loop.

Ja-Ja-Hey-Ho ★★★★
()

https://doc.qt.io/qt-6/qdialog.html#exec

Note: Avoid using this function; instead, use open(). Unlike exec(), open() is asynchronous, and does not spin an additional event loop. This prevents a series of dangerous bugs from happening (e.g. deleting the dialog's parent while the dialog is open via exec()). When using open() you can connect to the finished() signal of QDialog to be notified when the dialog is closed.

Dr64h ★★
()

ТС: я проверил этот код под Qt 6.7 на ubuntu jammy, ничего не виснет. Возможно, проблема в бекенде QFontDialog, если используется нативный? В таком случае, похоже, что действительно есть баг в Qt.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Возможно, проблема в бекенде QFontDialog, если используется нативный?

Кстати, да.

Если проблема где-то проявляется, а где-то нет, стоит поиграться с флагом DontUseNativeDialog из FontDialogOption, сравнить, одинаковое ли поведение получается. Поскольку, строго говоря, при этом два разных диалога вызываются.

ошибка не проявляется в Windows

В том числе и в Windows посмотреть, вносит ли DontUseNativeDialog разницу, да.

hobbit ★★★★★
()
Ответ на: комментарий от anonymous

Я ошибку обнаружил вообще в другом коде. Этот пример я специально написал для вас, так как он легко воспроизводит ошибку. qtextedit тут вообще не причём.

keeper_b ★★★★
() автор топика
Ответ на: комментарий от Dr64h

Читал это, но проблема в том, что они сами в своём коде пишут именно exec().

Глянь как они написали метод:

QFont QFontDialogPrivate::getFont(bool *ok, const QFont &initial, QWidget *parent,
                                  const QString &title, QFontDialog::FontDialogOptions options)

тут

keeper_b ★★★★
() автор топика
Ответ на: комментарий от keeper_b

более того, оно (или выбиралка цвета, не помню уж) еще и с мультимонитором проблемы имеет без DontUseNativeDialog - позиционируется совсем не там, где просят…

aol ★★★★★
()

При этом ошибка не проявляется в Windows и/или на Qt 5.

Осторожней с внешними по отношению к app.exec ивент-лупами. Раньше очевидный трюк с processEvents() в другом потоке, например, по-старому работавший на винде, в линуксе на отлично сломали где-то между версиями 4 и 5 и теперь его приходится делать с некоторыми дополнительными танцами.

https://www.google.com/search?q=Qt+processEvents%28%29+hangs&sca_esv=369bb2d90aa2509e&rlz=1C1GCEU_ruRU1045RU1045&ei=4AYmZqGiBIuSwPAPscCsiAE&udm=&ved=0ahUKEwihkqLzm9WFAxULCRAIHTEgCxEQ4dUDCBA&uact=5&oq=Qt+processEvents%28%29+hangs&gs_lp=Egxnd3Mtd2l6LXNlcnAiGFF0IHByb2Nlc3NFdmVudHMoKSBoYW5nczIIEAAYgAQYogQyCBAAGIAEGKIEMggQABiABBiiBEjqHlCPD1imGHABeACQAQCYAWegAd0CqgEDMy4xuAEDyAEA-AEBmAIEoALwApgDAIgGAZIHAzMuMaAHkAo&sclient=gws-wiz-serp

anonymous
()