Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ruzik от Март 04, 2011, 20:47



Название: Работа оператора tr
Отправлено: ruzik от Март 04, 2011, 20:47
Здравствуйте, возникла такая проблема:
У меня есть класс, который располагается в файлах h+cpp
И в cpp в реализации одной функции есть такая строчка
if(tableWidget->item(a,3)->text()==tr("Yes"))
И у меня не хочет определять оператор tr, а что подключить я не знаю
По смыслу надо QtCore, но не помогает пробовал и QtGui, хотя он тут вообще не при чем
Хотя в обычном проекте все работает нормально, смотрел в дизайнере что там подключается, ничего интересного не нашел, в pro файле то же ничего
Я знаю что дело макросе Q_OBJECT, но если его поставить то придется наследовать мой класс от QOBject, что возможно, но не желательно, так как я не пользуюсь не одной из функций QOBject, и КПД упадет, можно ли как-то сделать это избегая наследования


Название: Re: Работа оператора tr
Отправлено: kuzulis от Март 04, 2011, 21:03
Код
C++ (Qt)
if(tableWidget->item(a,3)->text()==QString(tr("Yes")))
 


Название: Re: Работа оператора tr
Отправлено: Fat-Zer от Март 04, 2011, 21:32
tr() - static член QObject
Код
C++ (Qt)
#include <QObject>
//...
if(tableWidget->item(a,3)->text()==QObject::tr("Yes"))


Название: Re: Работа оператора tr
Отправлено: lit-uriy от Март 04, 2011, 21:40
>>оператор tr
это не оператор, а функция.

Если ты её используешь не внутри класса, который унаследован от QObject, то поступать нужно, как сказал Fat-Zer


Название: Re: Работа оператора tr
Отправлено: pastor от Март 04, 2011, 21:44
Решение Fat-Zer работать небудет.

Юзай QT_TR_NOOP, QT_TRANSLATE_NOOP, qApp->translate(...)


Название: Re: Работа оператора tr
Отправлено: Fat-Zer от Март 04, 2011, 21:58
Решение Fat-Zer работать небудет.
можно узнать почему?


Название: Re: Работа оператора tr
Отправлено: Sancho_s_rancho от Март 04, 2011, 22:16
Решение Fat-Zer работать небудет.
можно узнать почему?
Насколько я помню классы без макроса Q_OBJECT опускаются и вызов статического метода тут не поможет.


Название: Re: Работа оператора tr
Отправлено: pastor от Март 04, 2011, 23:20
можно узнать почему?

А подумай, каким образом будет осуществлен перевод? Посомтри для интереса код tr. Думаю после просомтра кода станет все понятно.


Название: Re: Работа оператора tr
Отправлено: Fat-Zer от Март 04, 2011, 23:48
А подумай, каким образом будет осуществлен перевод? Посомтри для интереса код tr. Думаю после просомтра кода станет все понятно.
чего-то я вообще определение tr() не наблюдаю ::)
нашёл только это:
Код
C++ (Qt)
#ifdef QT_NO_TRANSLATION
   static QString tr(const char *sourceText, const char *, int)
       { return QString::fromLatin1(sourceText); }
   static QString tr(const char *sourceText, const char * = 0)
       { return QString::fromLatin1(sourceText); }
//.....
 
можете тыкнуть носом?


Название: Re: Работа оператора tr
Отправлено: pastor от Март 04, 2011, 23:55
Посомтри в  qobjectdefs.h

QT_TR_FUNCTIONS


Название: Re: Работа оператора tr
Отправлено: Fat-Zer от Март 05, 2011, 00:18
Код
C++ (Qt)
// qobjectdefs.h
   static inline QString tr(const char *s, const char *c, int n) \
       { return staticMetaObject.tr(s, c, n); } \
 
 
// qmetaobject.cpp
QString QMetaObject::tr(const char *s, const char *c, int n) const
{
   return QCoreApplication::translate(d.stringdata, s, c, QCoreApplication::CodecForTr, n);
}
 
// qcoreapplication.cpp
QString QCoreApplication::translate(const char *context, const char *sourceText,
                                   const char *disambiguation, Encoding encoding, int n)
 
 
в итоге вызов уходит туда же куда и qApp>translate(...), предложенный вами

ещё не очень понимаю, как работают эти макросы:
Код
C++ (Qt)
#define QT_TR_NOOP(x) (x)
#define QT_TR_NOOP_UTF8(x) (x)
#define QT_TRANSLATE_NOOP(scope, x) (x)
#define QT_TRANSLATE_NOOP_UTF8(scope, x) (x)
 


Название: Re: Работа оператора tr
Отправлено: Fat-Zer от Март 05, 2011, 00:26
ещё пример от троллей: http://doc.qt.nokia.com/4.7/linguist-hellotr.html


Название: Re: Работа оператора tr
Отправлено: pastor от Март 05, 2011, 01:18
http://doc.qt.nokia.com/4.7/internationalization.html

Цитировать
If the quoted text is not in a member function of a QObject subclass, use either the tr() function of an appropriate class, or the QCoreApplication::translate() function directly.

Цитировать
If you need to have translatable text completely outside a function, there are two macros to help: QT_TR_NOOP() and QT_TRANSLATE_NOOP(). They merely mark the text for extraction by the lupdate utility described below. The macros expand to just the text (without the context).


Название: Re: Работа оператора tr
Отправлено: Fat-Zer от Март 05, 2011, 01:30
Цитировать
If the quoted text is not in a member function of a QObject subclass, use either the tr() function of an appropriate class, or the QCoreApplication::translate() function directly.
ну так мой метод работать ведь будет...


Название: Re: Работа оператора tr
Отправлено: pastor от Март 05, 2011, 04:22
Да, состряпал пример простенький, действительно работает на 4.7.1. Приношу свои извенения, был неправ.


ЗЫ: Помниться когдато были проблемы с интернационализацей строк, которые находились "извне" QObject. И была именно описаная выше ситуация.


Название: Re: Работа оператора tr
Отправлено: ruzik от Март 05, 2011, 14:46
Всем большое спасибо!