如果在具有 Q_OBJECT 宏的类之外,则无法在 Qt Linguist 中获取字符串

Posted

技术标签:

【中文标题】如果在具有 Q_OBJECT 宏的类之外,则无法在 Qt Linguist 中获取字符串【英文标题】:Not able to get strings in Qt Linguist if outside of a class with the Q_OBJECT macro 【发布时间】:2021-09-22 12:02:30 【问题描述】:

我的项目中有一个文件,其中一些函数不是任何类的成员。我有一些要翻译的字符串,因此,不在从 Qt QObject 派生的任何类中或与类声明中的 Q_OBJECT 宏类似的任何类中,我使用了以下语法:

#define CONTEXT_STRING "Context string here"
...
... QCoreApplication::translate(CONTEXT_STRING, "String to be translated") ...

而不是通常的:

... tr("String to be translated") ...

我正在使用基于 Qt 5.2.1(MSVC 2010,32 位)的 Qt Creator 3.0.1。

我已经运行了 lupdate,但字符串仍然没有出现在 Qt Linguist 中。

一个完整的最小可重现示例是:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QString>
#include <QMessageBox>

#define CONTEXT_STRING "Context string here"

void standalonefun()

    QString msg;

    msg = QCoreApplication::translate(CONTEXT_STRING, "String to be translated");

    QMessageBox::information(0, "Message", msg);


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);

    standalonefun();


MainWindow::~MainWindow()
   
    delete ui;

【问题讨论】:

【参考方案1】:

终于发现需要写了:

... QCoreApplication::translate("Context string here", "String to be translated") ...

不能做:

#define CONTEXT_STRING "Context string here"
...
... QCoreApplication::translate(CONTEXT_STRING, "String to be translated") ...

因为 lupdate 没有检测到带有 #define 预处理器指令的第二种形式

【讨论】:

以上是关于如果在具有 Q_OBJECT 宏的类之外,则无法在 Qt Linguist 中获取字符串的主要内容,如果未能解决你的问题,请参考以下文章

QT 信号和槽链接时注意事项

如果我只使用插槽,是不是需要使用 Q_OBJECT 宏?

QT信号槽实现原理

Qt入门教程QObject篇元对象系统

Qt入门教程QObject篇元对象系统

qt中moc的作用