Russian Qt Forum
Ноябрь 25, 2024, 10:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамический перевод  (Прочитано 22549 раз)
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")), то проблемы такой нет.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Ноябрь 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"));
Записан

Пока сам не сделаешь...
admsasha
Гость
« Ответ #2 : Ноябрь 15, 2018, 15:15 »

Пробовал, только он как QToolButton определяется

Код:
        QToolButton *lbl = qobject_cast<QToolButton*>(w);
точно такой же эффект. До нажатия кнопки перевод есть, после нажатия исчезает.
Записан
admsasha
Гость
« Ответ #3 : Ноябрь 15, 2018, 15:32 »

Может есть правильный метод обновления перевода после
Код:
removeTranslator(&translator);
installTranslator(&translator);
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #4 : Ноябрь 15, 2018, 15:32 »

QAction не является наследником QWidget, его с помощью findChildren<QWidget *>() не найти. Добираться до QAction на форме нужно каким-то другим способом:
* findChildren<QAction *>()
* QWidget::actions()
* хранить в своём списке
* как-то ещё
Записан

Пока сам не сделаешь...
admsasha
Гость
« Ответ #5 : Ноябрь 15, 2018, 15:35 »

Тогда почему текст всё же меняется? Но до нажатия на неё  ?
Записан
admsasha
Гость
« Ответ #6 : Ноябрь 15, 2018, 15:37 »

Код:
    QList<QAction*> l2 = toolBar->findChildren<QAction *>();
    for (auto &x:l2){
        x->setText(tr("test"));
        x->setStatusTip(tr("test"));
    }

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

Сообщений: 858



Просмотр профиля
« Ответ #7 : Ноябрь 15, 2018, 15:47 »

Минимальный проект тогда выкладывайте, чтобы смотреть, что у вас там происходит.
Записан

Пока сам не сделаешь...
admsasha
Гость
« Ответ #8 : Ноябрь 15, 2018, 15:52 »

Да, уже сам хотел сделать минимальный проект.

Помогло вот что
Код:
    QList<QAction*> l2 = this->findChildren<QAction *>();
Записан
admsasha
Гость
« Ответ #9 : Ноябрь 15, 2018, 15:58 »

Но всё же хочется понять, почему текст устанавливался, но терялся перевод ?
Записан
admsasha
Гость
« Ответ #10 : Ноябрь 15, 2018, 16:04 »

Вот минимальный пример на котором была проблема.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #11 : Ноябрь 15, 2018, 18:20 »

Но всё же хочется понять, почему текст устанавливался, но терялся перевод ?

Похоже потому, что для QAction с checkable = true, при нажатии заново устанавливается statusTip для "связанных" с ним QWidget. А на момент accSound->setStatusTip(tr("test")) перевод ещё не был загружен (qApp->installTranslator(&translator) выполняется позже), поэтому в statusTip оказывается непереведённый текст.
Записан

Пока сам не сделаешь...
admsasha
Гость
« Ответ #12 : Ноябрь 16, 2018, 03:15 »

Конкретно само  checkable = true не имеет значение, этот же эффект возникнет даже при смене иконки или установки текста на этот элемент. text установится, а statusTip сбросится
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #13 : Ноябрь 16, 2018, 13:10 »

Конкретно само  checkable = true не имеет значение...

Конкретно в приведённом вами минимальном примере с проблемой, checkable = true имеет значение. В других случаях значение могут иметь другие факторы.
Записан

Пока сам не сделаешь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 22.