Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: admsasha от Ноябрь 15, 2018, 13:57



Название: Динамический перевод
Отправлено: admsasha от Ноябрь 15, 2018, 13:57
Делаю динамический перевод. Без перезагрузки программы. Но как то не получается.

Есть функция которая проходит по всем элементам и устанавливает новый перевод. Некий аналог retranslateUi из встроенного UI
Проверяю на данном коде (я знаю что это установка всем элементам tooltip)
Код:
    QList<QWidget*> l = this->findChildren<QWidget *>();
    for (int i=0;i<l.size();i++){
        QWidget *w = l[i];
        w->setToolTip(tr("test"));
    }

На форме есть QAction, который можно нажимать (setCheckable(true)). До нажатия на неё tooltip переведен, после нажатия перевод сбивается и устанавливается не переведенным. Если выполнить опять эту функцию, то снова перевод появляется, до первого нажатия на кнопку. Почему так ?

Если я использую не данный цикл, а напрямую устанавливаю myAction->setToolTip(tr("test")), то проблемы такой нет.


Название: Re: Динамический перевод
Отправлено: ViTech от Ноябрь 15, 2018, 15:06
На форме есть QAction, который можно нажимать (setCheckable(true)). До нажатия на неё tooltip переведен, после нажатия перевод сбивается и устанавливается не переведенным. Если выполнить опять эту функцию, то снова перевод появляется, до первого нажатия на кнопку. Почему так ?

Потому что QAction устанавливает свойства для QWidget, и QAction тоже надо переводить.

Если компилятор позволяет, то можно писать короче, как-то так:
Код
C++ (Qt)
   QList<QWidget*> l = this->findChildren<QWidget *>();
   for (auto& w : l)
       w->setToolTip(tr("test"));


Название: Re: Динамический перевод
Отправлено: admsasha от Ноябрь 15, 2018, 15:15
Пробовал, только он как QToolButton определяется

Код:
        QToolButton *lbl = qobject_cast<QToolButton*>(w);
точно такой же эффект. До нажатия кнопки перевод есть, после нажатия исчезает.


Название: Re: Динамический перевод
Отправлено: admsasha от Ноябрь 15, 2018, 15:32
Может есть правильный метод обновления перевода после
Код:
removeTranslator(&translator);
installTranslator(&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 *>();
    for (auto &x:l2){
        x->setText(tr("test"));
        x->setStatusTip(tr("test"));
    }

Эффект точно такой же. Перевод ставится, но только до нажатия. Как нажму на кнопку, перевод исчезает.


Название: 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 имеет значение. В других случаях значение могут иметь другие факторы.