В доке написано
Use tr() for all Literal Text
Wherever your program uses "quoted text" for text that will be presented to the user, ensure that it is processed by the QApplication::translate() function. Essentially all that is necessary to achieve this is to use QObject::tr(). For example, assuming the LoginWidget is a subclass of QWidget:
LoginWidget::LoginWidget()
{
QLabel *label = new QLabel( tr("Password:"), this );
...
}
This accounts for 99% of the user-visible strings you're likely to write.
и твое
tr() в тексте, который выводит MessageBox не стоит, в других местах стоит. Если вручную поставить tr(), начинает работать.
Так что это единтсвенный верный путь. Подругому не получится