Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何翻译qmessagebox中的按钮?_C++_Qt_Messagebox_Language Translation - Fatal编程技术网

C++ 如何翻译qmessagebox中的按钮?

C++ 如何翻译qmessagebox中的按钮?,c++,qt,messagebox,language-translation,C++,Qt,Messagebox,Language Translation,我有一个QMessageBox如下: QMessageBox::question(this, tr("Sure want to quit?"), tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No); 我如何翻译“是/否”这个词?因为没有地方可以放置tr()?这是一种方法: QMessageBox messageBox(QMessageBox::Question, tr("Sure want to q

我有一个
QMessageBox
如下:

QMessageBox::question(this, tr("Sure want to quit?"), 
    tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);

我如何翻译“是/否”这个词?因为没有地方可以放置
tr()

这是一种方法:

QMessageBox messageBox(QMessageBox::Question,
            tr("Sure want to quit?"),
            tr("Sure to quit?"),
            QMessageBox::Yes | QMessageBox::No,
            this);
    messageBox.setButtonText(QMessageBox::Yes, tr("Yes"));
    messageBox.setButtonText(QMessageBox::No, tr("No"));
并显示信息:

messageBox.exec();

没有理由这么做。这些文本在Qt自己的本地化文件中进行本地化。您需要在应用程序中提供Qt的本地化,也许还需要加载这些本地化。

对不起,我迟到了,但是有一种最好的方法来解决您的问题

正确的方法不是手动翻译这些字符串。Qt已经在
translation
文件夹中包含翻译

想法是加载Qt中包含的翻译(
qm
文件)

我想向您展示根据您的语言环境翻译消息的代码:

#include <QDebug>
#include <QtWidgets/QApplication>
#include <QMessageBox>
#include <QTranslator>
#include <QLibraryInfo>

int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    QTranslator qtTranslator;
    if (qtTranslator.load(QLocale::system(),
                "qt", "_",
                QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
    {
        qDebug() << "qtTranslator ok";
        app.installTranslator(&qtTranslator);
    }

    QTranslator qtBaseTranslator;
    if (qtBaseTranslator.load("qtbase_" + QLocale::system().name(),
                QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
    {
        qDebug() << "qtBaseTranslator ok";
        app.installTranslator(&qtBaseTranslator);
    }

    QMessageBox::question(0, QObject::tr("Sure want to quit?"), QObject::tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);

    return app.exec();
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
qtTranslator qtTranslator;
如果(qtTranslator.load)(QLocale::system(),
“qt”、“_u”,
QLibraryInfo::位置(QLibraryInfo::TranslationPath)))
{

qDebug()我为这个问题编写了一个特殊的QMessageBoxEx类

// init once your button texts
QMessageBoxEx::setCustomTextForButton(QMessageBox::Yes, "Да");
QMessageBoxEx::setCustomTextForButton(QMessageBox::No, "Нет");

// example usage
if (QMessageBoxEx::question(this, "Внимание", "Ошибка", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
{
   // OK
}

// header

class QMessageBoxEx : public QMessageBox
{
private:

    static QMap<QMessageBox::StandardButton, QString> m_customButtonNames;

protected:

    static void setCustomTextForButtons(QMessageBoxEx &msgBox);

public:

    QMessageBoxEx(QWidget *parent);

    static void setCustomTextForButton(QMessageBox::StandardButton button, const QString &text);

    static QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = NoButton);
    static QMessageBox::StandardButton information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = NoButton);
    static QMessageBox::StandardButton question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No), QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
    static QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = NoButton);

};

// implementation

QMap<QMessageBox::StandardButton, QString> QMessageBoxEx::m_customButtonNames;

void QMessageBoxEx::setCustomTextForButton(QMessageBox::StandardButton button, const QString &text)
{
    if (m_customButtonNames.contains(button))
        m_customButtonNames.erase(m_customButtonNames.find(button));

    m_customButtonNames[button] = text;
}

void QMessageBoxEx::setCustomTextForButtons(QMessageBoxEx &msgBox)
{
    if (m_customButtonNames.size())
    {
        QMessageBox::StandardButtons buttons = msgBox.standardButtons();

        for (auto button : m_customButtonNames.keys())
        {
            if (buttons & button)
            {
                msgBox.setButtonText(button, m_customButtonNames[button]);
            }
        }
    }
}

QMessageBox::StandardButton QMessageBoxEx::critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Critical);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBox::StandardButton QMessageBoxEx::information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Information);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBox::StandardButton QMessageBoxEx::question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Question);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBox::StandardButton QMessageBoxEx::warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Warning);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBoxEx::QMessageBoxEx(QWidget *parent) : QMessageBox(parent)
{

}
//一次初始化按钮文本
QMessageBox::setCustomTextForButton(QMessageBox::Yes,“ааa”);
QMessageBox::setCustomTextForButton(QMessageBox::否,“href=”);
//示例用法
if(QMessageBox::问题(这是“是”,“是”),QMessageBox::是| QMessageBox::否)=QMessageBox::是)
{
//嗯
}
//标题
类QMessageBox:publicqMessageBox
{
私人:
静态QMap m_customButtonNames;
受保护的:
静态无效setCustomTextForButtons(QMessageBoxEx和msgBox);
公众:
QMessageBoxEx(QWidget*父项);
静态无效setCustomTextForButton(QMessageBox::StandardButton按钮,常量QString&text);
静态QMessageBox::StandardButton critical(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons=QMessageBox::Ok、QMessageBox::StandardButton defaultButton=NoButton);
静态QMessageBox::StandardButton信息(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons buttons=QMessageBox::Ok、QMessageBox::StandardButton defaultButton=NoButton);
静态QMessageBox::StandardButton问题(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons buttons=QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No)、QMessageBox::StandardButton defaultButton=QMessageBox::NoButton);
静态QMessageBox::StandardButton警告(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons=QMessageBox::Ok、QMessageBox::StandardButton defaultButton=NoButton);
};
//实施
QMap QMessageBoxEx::m_customButtonNames;
void QMessageBox::setCustomTextForButton(QMessageBox::StandardButton按钮,常量QString&text)
{
if(m_customButtonNames.contains(按钮))
m_customButtonNames.erase(m_customButtonNames.find(button));
m_customButtonNames[按钮]=文本;
}
void QMessageBoxEx::setCustomTextForButtons(QMessageBoxEx&msgBox)
{
if(m_customButtonNames.size())
{
QMessageBox::StandardButtons=msgBox.StandardButtons();
用于(自动按钮:m_customButtonNames.keys())
{
if(按钮和按钮)
{
msgBox.setButtonText(按钮,m_customButtonNames[按钮]);
}
}
}
}
QMessageBox::StandardButton QMessageBox::critical(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons按钮、QMessageBox::StandardButton默认按钮)
{
QMessageBoxEx msgBox(父项);
setIcon(QMessageBox::Critical);
msgBox.setWindowTitle(标题);
msgBox.setText(文本);
msgBox.设置标准按钮(按钮);
msgBox.setDefaultButton(defaultButton);
设置CustomTextForButtons(msgBox);
返回(QMessageBox::StandardButton)msgBox.exec();
}
QMessageBox::StandardButton QMessageBox::信息(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons按钮、QMessageBox::StandardButton默认按钮)
{
QMessageBoxEx msgBox(父项);
setIcon(QMessageBox::信息);
msgBox.setWindowTitle(标题);
msgBox.setText(文本);
msgBox.设置标准按钮(按钮);
msgBox.setDefaultButton(defaultButton);
设置CustomTextForButtons(msgBox);
返回(QMessageBox::StandardButton)msgBox.exec();
}
QMessageBox::StandardButton QMessageBox::question(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons按钮、QMessageBox::StandardButton默认按钮)
{
QMessageBoxEx msgBox(父项);
setIcon(QMessageBox::Question);
msgBox.setWindowTitle(标题);
msgBox.setText(文本);
msgBox.设置标准按钮(按钮);
msgBox.setDefaultButton(defaultButton);
设置CustomTextForButtons(msgBox);
返回(QMessageBox::StandardButton)msgBox.exec();
}
QMessageBox::StandardButton QMessageBox::warning(QWidget*父项、常量QString和标题、常量QString和文本、QMessageBox::StandardButtons按钮、QMessageBox::StandardButton默认按钮)
{
QMessageBoxEx msgBox(父项);
设置图标(QMessageBox::警告);
msgBox.setWindowTitle(标题);
msgBox.setText(文本);
msgBox.设置标准按钮(按钮);
msgBox.setDefaultButton(defaultButton);
设置CustomTextForButtons(msgBox);
返回(QMessageBox::StandardButton)msgBox.exec();
}
QMessageBoxEx::QMessageBoxEx(QWidget*父项):QMessageBox(父项)
{
}
要点:更新: 我在D:\Qt\Qt5.7.0\5.7\Src\qttranslations\translations\qtbase_**.ts中发现已经有QPlatformTheme的翻译srouce文件(不幸的是,没有qtbase_zh_CN.ts),您也可以复制qtbase_**.ts并立即修改它。 如果你是像我一样的中国人,多亏了,他已经
TRANSLATIONS    +=  gui_zh.ts
QMessageBox::information(this,
    QString("警告"),
    QString("测试文本"),
    QMessageBox::Yes | QMessageBox::No
);