Название: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 13:57 Делаю динамический перевод. Без перезагрузки программы. Но как то не получается.
Есть функция которая проходит по всем элементам и устанавливает новый перевод. Некий аналог retranslateUi из встроенного UI Проверяю на данном коде (я знаю что это установка всем элементам tooltip) Код: QList<QWidget*> l = this->findChildren<QWidget *>(); На форме есть QAction, который можно нажимать (setCheckable(true)). До нажатия на неё tooltip переведен, после нажатия перевод сбивается и устанавливается не переведенным. Если выполнить опять эту функцию, то снова перевод появляется, до первого нажатия на кнопку. Почему так ? Если я использую не данный цикл, а напрямую устанавливаю myAction->setToolTip(tr("test")), то проблемы такой нет. Название: Re: Динамический перевод Отправлено: ViTech от Ноябрь 15, 2018, 15:06 На форме есть QAction, который можно нажимать (setCheckable(true)). До нажатия на неё tooltip переведен, после нажатия перевод сбивается и устанавливается не переведенным. Если выполнить опять эту функцию, то снова перевод появляется, до первого нажатия на кнопку. Почему так ? Потому что QAction устанавливает свойства для QWidget, и QAction тоже надо переводить. Если компилятор позволяет, то можно писать короче, как-то так: Код
Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 15:15 Пробовал, только он как QToolButton определяется
Код: QToolButton *lbl = qobject_cast<QToolButton*>(w); Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 15:32 Может есть правильный метод обновления перевода после
Код: removeTranslator(&translator); Название: Re: Динамический перевод Отправлено: ViTech от Ноябрь 15, 2018, 15:32 QAction не является наследником QWidget, его с помощью findChildren<QWidget *>() не найти. Добираться до QAction на форме нужно каким-то другим способом:
* findChildren<QAction *>() * QWidget::actions() * хранить в своём списке * как-то ещё Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 15:35 Тогда почему текст всё же меняется? Но до нажатия на неё ?
Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 15:37 Код: QList<QAction*> l2 = toolBar->findChildren<QAction *>(); Эффект точно такой же. Перевод ставится, но только до нажатия. Как нажму на кнопку, перевод исчезает. Название: Re: Динамический перевод Отправлено: ViTech от Ноябрь 15, 2018, 15:47 Минимальный проект тогда выкладывайте, чтобы смотреть, что у вас там происходит.
Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 15:52 Да, уже сам хотел сделать минимальный проект.
Помогло вот что Код: QList<QAction*> l2 = this->findChildren<QAction *>(); Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 15:58 Но всё же хочется понять, почему текст устанавливался, но терялся перевод ?
Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 15, 2018, 16:04 Вот минимальный пример на котором была проблема.
Название: Re: Динамический перевод Отправлено: ViTech от Ноябрь 15, 2018, 18:20 Но всё же хочется понять, почему текст устанавливался, но терялся перевод ? Похоже потому, что для QAction с checkable = true, при нажатии заново устанавливается statusTip для "связанных" с ним QWidget. А на момент accSound->setStatusTip(tr("test")) перевод ещё не был загружен (qApp->installTranslator(&translator) выполняется позже), поэтому в statusTip оказывается непереведённый текст. Название: Re: Динамический перевод Отправлено: admsasha от Ноябрь 16, 2018, 03:15 Конкретно само checkable = true не имеет значение, этот же эффект возникнет даже при смене иконки или установки текста на этот элемент. text установится, а statusTip сбросится
Название: Re: Динамический перевод Отправлено: ViTech от Ноябрь 16, 2018, 13:10 Конкретно само checkable = true не имеет значение... Конкретно в приведённом вами минимальном примере с проблемой, checkable = true имеет значение. В других случаях значение могут иметь другие факторы. |