翻译时qapplication会从后向前遍历app.installTranslator(&translator)安装的QTranslator,然后qtranslator会调用 translate(const char *context, const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1) 从自己加载的qm中寻找该context中的源字符返回对应的翻译字符
   源码中的调用顺序如下
   QString 
QMetaObject::tr(const char *s, const char *c, int n) const
{
    return 
QCoreApplication::translate(objectClassName(this), s, c, n);
} 
QString 
QCoreApplication::translate(const char *context, const char *sourceText,
                                    const char *disambiguation, int n)
{
    QString result; 
    if (!sourceText)
        return result; 
    if (self && !self->d_func()->translators.isEmpty()) {
        QList<QTranslator*>::ConstIterator it;
        QTranslator *translationFile;
        for (it = self->d_func()->translators.constBegin(); it != self->d_func()->translators.constEnd(); ++it) {
            translationFile = *it;
            result = 
translationFile->translate(context, sourceText, disambiguation, n);
            if (!result.isNull())
                break;
        }
    } 
    if (result.isNull())
        result = QString::fromUtf8(sourceText); 
    replacePercentN(&result, n);
    return result;
}
QString 
QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation,
                               int n) const
{
    Q_D(const QTranslator);
    return 
d->do_translate(context, sourceText, disambiguation, n);
} 
 do_translate里面就是怎么查找的问题了,没必要细看了