2016-01-06 2 views
0

Возможно, я работал в углу, но это звучало для меня как хорошая идея в то время.QT Creator: Запуск слота с кодом?

Я разрабатываю интерфейс, который позволяет пользователю изменять настройки роботизированного устройства, то есть скорость, направления, силу и т. Д. С очень большой серией опций в виде ComboBoxes. Проблема в том, что в подкатегориях содержится около тысячи таких вещей. например Категория скорости x1, x2, x3, Y1, y2 и т. Д. Поэтому вместо того, чтобы создавать тысячу списков в QT, я подумал, что хорошей идеей было создать один набор из 50 (иш), а затем предоставить несколько кнопок для переключения между категориями. Поэтому, когда пользователь выбирает скорость QT, заполняет списки со списком с соответствующими параметрами, устанавливает таблицы стилей и текст для меток и т. Д. Таким образом, кажется, что выделенная страница существует. Затем, если пользователь выбирает Direction, QT Записывает текущий индекс каждого окна в выделенный массив, а затем повторно заполняет поля, метки и т. Д. Соответствующим содержимым. Затем я делаю это снова и снова для различных потребностей системы.

Все это работает нормально. Тем не менее, я теперь привязан, где расширены опции для навигации по каждой странице. Например, у меня есть кнопки вперед/назад (например, вы ожидаете от мастера настройки), а также меню действий вверху, чтобы перейти на страницу. Итак, теперь код становится очень повторяющимся. Если вы выберете следующую кнопку, я напишу текущие значения в массив, а затем повторно запомню. Если вы переходите на страницу из любого места, я смотрю, где я, записываю ее в массив и заполняю поля. Поэтому, если мне нужно что-то изменить, я должен внести изменения в множество мест в коде.

Я знаю, что это не оптимально. То, что я хотел бы сделать, это запустить непрерывный цикл, как обычно, с Micros в C. Таким образом, программа может смотреть на переменную в каждом проходе, и если это так, то это происходит. Я не настолько квалифицирован, чтобы понять этот цикл в QT. Итак, моя новая мысль была ...

Можно ли вызвать действие или слот с переменной. Например, если пользователь нажимает кнопку «Далее», он вызывает слот для кнопки, которая не существует, так что QT будет выполнять определенную строку кода? Тогда у меня может быть 1 выделенный раздел, посвященный чтению и написанию ящиков, с кучей действий, которые приведут меня туда.

+1

Непонятно, почему кнопка FWD/BCK должна использовать другой код для комбо, чем прямой nav. В обоих случаях это «сохранить текущий экран, заполнить новый экран» ...? – Ilya

+0

:) Я ценю ваши отзывы. Вы, вероятно, правы, я всего лишь наивный мех. Инженер пытается понять это.Однако я рассмотрю это. Спасибо – Mike

ответ

0

Вы можете сделать сигнал, который вызван вызовом emit в вашем коде, чтобы вы подключили следующий сигнал кнопки, нажав на слот, который выполняет некоторую работу и перемещается, или напрямую вызывает другой сигнал, который вы созданный, который запускает слот в другом месте или выполняет некоторую работу в лямбда, вызванной нажатием кнопки.

+0

Мне это нравится, спасибо, я не очень хорошо знаком с этим, но я буду играть. С наилучшими пожеланиями. – Mike

0

Я бы сначала загрузил все параметры ComboBoxes в массив QStringList (или, может быть, массив из QList<QLatin1String> списков - для экономии памяти и эффективности кода).

Тогда я бы сохранил массив из 1000 целых чисел для текущих индексов ComboBox.

Когда пользователь изменяет значение в некоторой ComboBox, то currentIndexChanged сигнал срабатывает соответствующий слот (один слот для всех ComboBoxes будет достаточно - sender()->objectName(), чтобы получить имя ComboBox, который послал сигнал):

void WindowWidget::on_ComboBox_currentIndexChanged(int index) 
{ 
    name = sender()->objectName(); 
    /* here change the corresponding integer in the current 
     indexes array */ 
} 

Нажмем кнопку Next/Back, чтобы заполнить ComboBoxes. Кроме того, предоставите некоторую кнопку «Сохранить» для сохранения индексов ComboBoxes (или запускайте слот Save на какое-либо действие, то есть на закрытие окна даже на сигнал таймера).

+0

Действительно круто. И я очень ценю подсказку. Я попробую это. – Mike