Как заменить метки/подсказки пользовательского интерфейса во время выполнения приложения Qt в соответствии с контекстом?

Мы разрабатываем приложение Qt Desktop. Приложение может открывать несколько файлов по одному на каждой вкладке, и каждая вкладка (файл) имеет свой контекст. Пользователь может открывать несколько файлов и переключаться между этими вкладками.

например : Например, одна вкладка управления грузовиками, для которой действие (add_Vehicle) на панели инструментов должно отображать всплывающую подсказку «Добавить грузовик», а если другая вкладка относится к управлению автомобилями, то же действие должно отображать всплывающую подсказку «Добавить автомобиль».

Таких вещей много:

  1. Если я удалю грузовик (т. е. «Транспортное средство» на вкладке «Управление грузовиками»), должно появиться окно с сообщением «Грузовик успешно удален». и если автомобиль (т.е. автомобиль из вкладки «Управление автомобилем») удален, должно появиться сообщение «Автомобиль успешно удален».

  2. Есть несколько диалогов, в которых тексты напрямую устанавливаются в QLabels через QtDesinger.

Как возникла эта проблема?

Ранее приложение поддерживало только управление грузовиками, теперь мы добавляем поддержку управления автомобилями в том же приложении. Все сообщения/метки пользовательского интерфейса/подсказки используют «Грузовик». Теперь мы хотим изменить его в соответствии с открытой вкладкой (файлом).

Осуществимое продуманное решение: (не работает во время выполнения)

Все UILabels/ToolTips/Messages являются переводимыми [т.е. написанный с помощью QObject::tr(..)]. Мы подумали об установке QTranslator в соответствии с контекстом вкладки, который будет автоматически менять тексты во всех местах. Установка среды выполнения QTranslator не работает.

Есть ли другой способ сделать это? Или любой указатель/подсказки будут очень полезны.


person Anwar Shaikh    schedule 05.02.2013    source источник


Ответы (2)


Файл/вкладка, вероятно, будет знать, чем он управляет («Грузовик», «Автомобиль», «Самолет»), поэтому ему потребуется идентификатор, чтобы сделать это различие

Для всплывающих подсказок: Подпишитесь на изменения «текущего» файла/вкладки. У QTabWidget есть сигнал void currentChanged(int index), на который вы можете подписаться. Когда текущий файл/вкладка изменяется (либо из-за открытия нового файла и получения фокуса, либо из-за того, что пользователь перешел на другой файл/вкладку), извлеките идентификатор из нового текущего файла/вкладки и соответствующим образом установите текст всплывающих подсказок.

Для окон сообщений: если вы хотите отобразить окно сообщений для "... удалено успешно", получите идентификатор текущего файла/вкладки и используйте его для создания сообщения, которое вам нужно показать.

person PrisonMonkeys    schedule 05.02.2013
comment
Много действий/диалогов. Таким образом, все они должны быть подписаны на TabIndexChanged, и вдобавок ко всему, не только изменить один текстовый грузовик на автомобиль, но и еще несколько текстов необходимо изменить в соответствии с контекстом. Что делать излишне. - person Anwar Shaikh; 05.02.2013
comment
Может быть достаточно, чтобы только родительский виджет подписался на эти изменения и установил тексты всех необходимых дочерних виджетов. Разве это все еще не перебор? - person PrisonMonkeys; 05.02.2013

Я не вижу проблемы, так как текст внутри меток/подсказок и т. д. легко изменить в Qt. Просто вызовите методы QLabel::setText и QToolTip::showText с соответствующим текстом из методов вашего класса, т. е.:

myTruck::myTruck(QWidget *parent) :
   QObject(parent)
{
   /* do whatever you do in your class constructor */
   <...>
   myLabel->setText("Truck");
   <...>
}

myTruck::~myTruck() :
   QObject(parent)
{
   /* do whatever you do in your class destructor */
   <...>
   myTooltip->showText("Truck deleted successfully");
   <...>
}

myLabel и myTooltip, вероятно, являются членами MainWindow, и если у вас нет прямого доступа к ним (частные члены), может потребоваться механизм signal&slots изменить их.

person KBart    schedule 05.02.2013