Название: Трансляция в не QObject-контексте. Отправлено: Akon от Март 14, 2011, 14:23 Есть класс, не являющийся наследником QObject. Трансляцию строк делаю так:
Код: void FooClass::someFunc() Может я чего не доглядел в документации и есть вариант покороче? В приведенном варианте конструкция громоздка да и "FooClass" встречается дважды? Название: Re: Трансляция в не QObject-контексте. Отправлено: twp от Март 14, 2011, 14:28 этот метод статический
Код: QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) [static] Название: Re: Трансляция в не QObject-контексте. Отправлено: Akon от Март 14, 2011, 14:35 В этом методе нет информации о контексте ("FooClass").
Название: Re: Трансляция в не QObject-контексте. Отправлено: IMPOMEZIA от Март 14, 2011, 16:00 Используйте FooClass::tr() вместо QObject::tr() ;)
Если конечно FooClass наследник QObject, а перевести нужно за пределами FooClass. Название: Re: Трансляция в не QObject-контексте. Отправлено: GreatSnake от Март 14, 2011, 16:04 Я делаю вот так:
Код
MainWindow меняешь на любой класс с Q_OBJECT. Название: Re: Трансляция в не QObject-контексте. Отправлено: twp от Март 14, 2011, 16:10 достаточно будет и QObject::tr() даже если будет много классов для перевода, если будут конфликты то в tr есть параметр disambiguation для их разрешения
Название: Re: Трансляция в не QObject-контексте. Отправлено: GreatSnake от Март 14, 2011, 16:23 Цитировать достаточно будет и QObject::tr() Согласен, но может случиться, что общая свалка станет очень громоздкой.Имхо, с контекстом нагляднее, да и перевод делать легче. Название: Re: Трансляция в не QObject-контексте. Отправлено: Akon от Март 14, 2011, 17:25 2 GreatSnake:
Элегантный способ, в том смысле, что контекст ("MainWindow") подсунут без зависимости от хедера MainWindow. Но всегда должен существовать класс MainWindow (или любой класс с Q_OBJECT вместо него). Мне не хотелось бы внедряться в контекст существующего класса. Можно, конечно, сделать фиктивный Q_OBJECT класс для целей трансляции, но это как-то не очень красиво. Чем яснее контекст тем нагляднее, да и перевод делать легче. Название: Re: Трансляция в не QObject-контексте. Отправлено: GreatSnake от Март 14, 2011, 17:34 Цитировать Мне не хотелось бы внедряться в контекст существующего класса. Тогда вот так :)Код
Название: Re: Трансляция в не QObject-контексте. Отправлено: Akon от Март 14, 2011, 18:42 Спасибо за представленные здесь идеи!
Не скомпилируется - tr() должен быть виден для компилятора. А при открытом макросе tr() закроешь tr() функции от Q_OBJECT других классов, если они будут в текущей области видимости. Также интересно, что Код: void FooClass::someFunc() Код: void FooClass::someFunc() Ну и если lupdate научится понимать директивы условной компиляции, то эти подходы и вовсе не покатят. Название: Re: Трансляция в не QObject-контексте. Отправлено: GreatSnake от Март 14, 2011, 18:52 Цитировать Не скомпилируется - tr() должен быть виден для компилятора. А при открытом макросе tr() закроешь tr() функции от Q_OBJECT других классов, если они будут в текущей области видимости. Малость напутал. Так будет лучшеКод
Название: Re: Трансляция в не QObject-контексте. Отправлено: Akon от Март 14, 2011, 20:04 Тогда так (без ошибок):
Код: class FooClass // for tr С виду элегантно, но менее читаемо относительно изначального "лобового" варианта. И в общем случае макрос tr нужно "перегрузить" под соответствующие перегрузки QCoreApplication::translate, что сделать не удастся. Название: Re: Трансляция в не QObject-контексте. Отправлено: twp от Март 15, 2011, 11:49 как оказалось все намного проще, есть макрос для этих целей, вот пример из асистента:
Код: class MyClass Название: Re: Трансляция в не QObject-контексте. Отправлено: Akon от Март 15, 2011, 13:23 Цитировать Может я чего не доглядел в документации и есть вариант покороче? Так и знал.Спасибо. Как недостаток Q_DECLARE_TR_FUNCTIONS требует подключения в хедере MyClass #include <QtCore/QCoreApplication>. Ну и подход в Q_DECLARE_TR_FUNCTIONS через QCoreApplication::translate. Название: Re: Трансляция в не QObject-контексте. Отправлено: Akon от Март 15, 2011, 16:46 Банально разбил Q_DECLARE_TR_FUNCTIONS на части: декларация/имплементация.
Гораздо меньшее удобство использования, зато <QtCore/QCoreApplication> не вылезает наружу. TrFunctionsDecl.h Код: #pragma once TrFunctionsImpl.h Код: #pragma once |