Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Fregloin от Май 22, 2015, 12:12



Название: Странный креш програмы изза QFont::setFontFamily в ui файле
Отправлено: Fregloin от Май 22, 2015, 12:12
Привет. Ситуация следующая: есть несколько плагинов, которые представляют собой плавающие виджеты-доки, которые прикрепляются к главному окну.\
До поры до времени все отлично работало. Но вот уже несколько дней прога падает без каких либо причин при закрытии, иногда при смене режима работы (в данном случае при выгрузке плагинов).
Три дня промучавшись нашел причину. Сделал пустой плагин док-виджет с пустой формой. Прога падает. Полез в сгеренрированный ui.h файл и нашёл такие строки
Код:
class Ui_PositionDock
{
public:
    QWidget *dockWidgetContents;
    QVBoxLayout *verticalLayout;

    void setupUi(QDockWidget *PositionDock)
    {

        if (PositionDock->objectName().isEmpty())
            PositionDock->setObjectName(QStringLiteral("PositionDock"));

        PositionDock->setEnabled(true);
        PositionDock->resize(96, 605);
        QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);

        sizePolicy.setHeightForWidth(PositionDock->sizePolicy().hasHeightForWidth());
        PositionDock->setSizePolicy(sizePolicy);
        PositionDock->setMinimumSize(QSize(96, 605));
        PositionDock->setMaximumSize(QSize(96, 800));

        QFont font;
        font.setFamily("Arial"); //<<<<<--- без QStringLiteral работает! С ним падает (отладчик показывает на QFontEngine operator::=).
        font.setPointSize(8);
        PositionDock->setFont(font);
        /*
        PositionDock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);

        dockWidgetContents = new QWidget();
        dockWidgetContents->setObjectName(QStringLiteral("dockWidgetContents"));
        verticalLayout = new QVBoxLayout(dockWidgetContents);
        verticalLayout->setObjectName(QStringLiteral("verticalLayout"));

        PositionDock->setWidget(dockWidgetContents);

        retranslateUi(PositionDock);

        QMetaObject::connectSlotsByName(PositionDock);
        */
    } // setupUi

    void retranslateUi(QDockWidget *PositionDock)
    {
        PositionDock->setWindowTitle(QApplication::translate("PositionDock", "\320\237\320\276\320\267\320\270\321\206\320\270\321\217", 0));
    } // retranslateUi

};
Закоментировал даже создание как такового виджета формы, все равно был креш, пока не убрал QStringLiteral из setFont. Не знаю с чем это связано, но в остальных местах проблем не наблюдается. Кстати это падает под виндой, а в линуксе все ок. Версия 5.4.1. Кто то может объяснить с чем это все связано? Деструкторы плагина отрабатывают правильно, т.е. все объекты плагинов удаляются, утечек тоже нет, прогнал валгриндом. Похоже на какой то баг самого Qt.


Название: Re: Странный креш програмы изза QFont::setFontFamily в ui файле
Отправлено: Fregloin от Май 22, 2015, 12:28
Все разобрался! Похоже таки баг. Суть в том что под линуксом я выставил шрифт Arial для некоторых виджетов. Почему то в винде даже при их наличии программа падает в сегментацию.
Если же в редакторе сбросить свойство шрифта по умолчанию (Ms Shell Dlg, Sergoe UI), то вуаля все работает как часы! Нужно как то написать эту ситуацию в Qt. Как это сделать?


Название: Re: Странный креш програмы изза QFont::setFontFamily в ui файле
Отправлено: Igors от Май 22, 2015, 12:46
Все разобрался! Похоже таки баг. Суть в том что под линуксом я выставил шрифт Arial для некоторых виджетов. Почему то в винде даже при их наличии программа падает в сегментацию.
Если же в редакторе сбросить свойство шрифта по умолчанию (Ms Shell Dlg, Sergoe UI), то вуаля все работает как часы! Нужно как то написать эту ситуацию в Qt. Как это сделать?
Не торопитесь, именно такой баг (краш потому что Arial) маловероятен. У меня на Вындоуз это шрифт по умолчанию - все норм (правда Qt 5.3.2 - скоро обновлюсь)


Название: Re: Странный креш програмы изза QFont::setFontFamily в ui файле
Отправлено: Fregloin от Май 22, 2015, 13:45
Возможно этот баг не связан именно с Arial, но он имеет быть место у меня. Потому что падение происходит в QtGui.dll.


Название: Re: Странный креш програмы изза QFont::setFontFamily в ui файле
Отправлено: Racheengel от Май 26, 2015, 18:02
с 5.4.1 я бы посоветовал не торопиться, она достаточно сырая. Мы пробовали ее использовать, но из-за обилия багов отказались.


Название: Re: Странный креш програмы изза QFont::setFontFamily в ui файле
Отправлено: Fregloin от Май 27, 2015, 08:54
это версия вышла достаточно давно.. это уже не первый случай когда у меня программа падает изза странных багов qt...