Получение Qt Layout Direction для использования функций справа налево (например, для арабского языка) в каскадных меню
Я пишу приложение QT5.5 на OS X 10.11. Я реализовал опции меню для динамического переключения между языками, включая установку Qt::LayoutDirection для языков справа налево. В качестве макета поддержки языка справа налево я создал тестовое приложение и файл перевода на арабский язык. Вот снимок экрана:
Мое полное незнание арабского языка мне здесь не помогает - показанные переводы взяты из 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:
Обратите внимание, что галочки расположены справа, весь текст выровнен по правому краю, а стрелка подменю указывает влево, как и должно быть.
Поэтому вывод заключается в том, что приведенный выше код является правильным, и, как представляется, существует ошибка в поддержке платформы Какао для каскадных меню в языках справа налево в Qt5.5 в OS X.