Получение Qt Layout Direction для использования функций справа налево (например, для арабского языка) в каскадных меню

Я пишу приложение QT5.5 на OS X 10.11. Я реализовал опции меню для динамического переключения между языками, включая установку Qt::LayoutDirection для языков справа налево. В качестве макета поддержки языка справа налево я создал тестовое приложение и файл перевода на арабский язык. Вот снимок экрана:

menus_screenshot

Мое полное незнание арабского языка мне здесь не помогает - показанные переводы взяты из Google Translate (приложение будет профессионально переведено, когда оно будет закончено). Тем не менее поведение выглядит только отчасти правильным.

Эти функции соответствуют моим ожиданиям:

  • Пункты меню "Файл"/"Редактировать"/"Параметры" начинаются с правой стороны экрана
  • Подменю "Язык" меню "Параметры" располагается в левой части главного меню "Параметры".

Следующие функции, однако, не соответствуют моим ожиданиям:

  • Пункты меню "Первый"/"Второй"/"Третий"/"Язык" меню "Параметры" выровнены по левому краю, а не по правому
  • Галочки находятся слева от записей, а не справа
  • Стрелка подменю-каскад для подменю "Язык" указывает вправо, а не влево

Мой первый вопрос, поэтому, является ли мои ожидания неправильными, и интерфейс фактически ведет себя правильно для арабского языка, или в качестве альтернативы, что должно быть исправлено?

Обновление: мои говорящие по-арабски коллеги подтверждают, что приведенный выше снимок экрана неверен в упомянутых мною смыслах, что вместо этого он должен выглядеть так:

Мой второй, и теперь главный, вопрос: как исправить все, что неправильно, чтобы заставить каскадное меню Qt вести себя правильно для языков справа налево?

Ниже приведен полный код этого автономного примера, а также файл переводов Qt ".ts", который я использовал.

#include <QApplication>
#include <QMainWindow>
#include <QtGui>
#include <QTranslator>
#include <QLabel>
#include <QMenuBar>
#include <QMenu>

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

    QMainWindow* mw = new QMainWindow();

    QTranslator* translator = new QTranslator();

    translator->load( "translations.qm" );

    app.installTranslator( translator );

    app.setLayoutDirection( Qt::RightToLeft );

    QLabel* aLabel = new QLabel( mw );

    mw->menuBar()->setNativeMenuBar( false );

    QMenu* fileMenu = new QMenu( QMainWindow::tr( "File" ) );
    QMenu* editMenu = new QMenu( QMainWindow::tr( "Edit" ) );
    QMenu* optionsMenu = new QMenu( QMainWindow::tr( "Options" ) );

    mw->menuBar()->addMenu( fileMenu );
    mw->menuBar()->addMenu( editMenu );
    mw->menuBar()->addMenu( optionsMenu );

    QAction* firstAction = new QAction( QMainWindow::tr( "First" ), optionsMenu );
    QAction* secondAction = new QAction( QMainWindow::tr( "Second" ), optionsMenu );
    QAction* thirdAction = new QAction( QMainWindow::tr( "Third" ), optionsMenu );

    firstAction->setCheckable( true );
    firstAction->setChecked( true );

    optionsMenu->addAction( firstAction );
    optionsMenu->addAction( secondAction );
    optionsMenu->addAction( thirdAction );

    QMenu* languageMenu = new QMenu( QMainWindow::tr( "Language" ) );
    QAction* englishAction = new QAction( QMainWindow::tr( "English" ), languageMenu );
    QAction* arabicAction = new QAction( QMainWindow::tr( "Arabic" ), languageMenu );
    languageMenu->addAction( englishAction );
    languageMenu->addAction( arabicAction );
    optionsMenu->addMenu( languageMenu );

    mw->show();

    return app.exec();
}

И файл переводов:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
    <name>QMainWindow</name>
    <message>
        <location filename="qt_rtl.cc" line="21"/>
        <source>File</source>
        <translation>Ù~EÙ~DÙ~A</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="22"/>
        <source>Edit</source>
        <translation>تحرÙ~Jر</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="23"/>
        <source>Options</source>
        <translation>Ø®Ù~Jارات</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="29"/>
        <source>First</source>
        <translation>اÙ~DØ£Ù~HÙ~D</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="30"/>
        <source>Second</source>
        <translation>ثاÙ~FÙ~Jا</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="31"/>
        <source>Third</source>
        <translation>Ø«Ù~DØ«</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="40"/>
        <source>Language</source>
        <translation>Ù~Dغة</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="41"/>
        <source>English</source>
        <translation>English</translation>
    </message>
    <message>
        <location filename="qt_rtl.cc" line="42"/>
        <source>Arabic</source>
        <translation>اÙ~DعربÙ~JØ©</translation>
    </message>
</context>
</TS>

Я бы надеялся, что app.setLayoutDirection( Qt::RightToLeft ); строка "правильно сделала бы" для всех виджетов и вложенных виджетов, но это не так. Возможно, хотя это было? Любая помощь приветствуется.

Спасибо

1 ответ

Решение

Точно такой же код прекрасно работает с Qt5.5, работающим в CentOS 6.7 Linux, то есть с плагином платформы X11 вместо Cocoa:

Каскадное арабское меню Qt в Linux

Обратите внимание, что галочки расположены справа, весь текст выровнен по правому краю, а стрелка подменю указывает влево, как и должно быть.

Поэтому вывод заключается в том, что приведенный выше код является правильным, и, как представляется, существует ошибка в поддержке платформы Какао для каскадных меню в языках справа налево в Qt5.5 в OS X.

Другие вопросы по тегам