Russian Qt Forum
Ноябрь 25, 2024, 21:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: 3 QComboBox и 1 список  (Прочитано 4798 раз)
vorotislav
Гость
« : Январь 13, 2015, 09:16 »

Доброго времени суток.
Есть задача, получать в программе список всех com-портов и выбирать 3 из них для подключения.
Сначала делал так:
Код:
// cbPortName* - объект класса QComboBox
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        cbPortName1->addItem(info.portName());
        cbPortName2->addItem(info.portName());
        cbPortName3->addItem(info.portName());
    }

И все хорошо, работает. Но здесь можно выбрать один и тот же порт для подключения. И тогда в программе вместо 3-х подключений будет одно и две ошибки.
А можно ли сделать так: список доступных портов в, например, QStringList. Затем мы задаем элементы для первого комбобокса. Пользователь выбирает нужный, и тут надо чтоб создавалась или копия списка минус выбранный или в исходном минусовать. Затем выбираем во втором и еще раз убираем выбранный. Не подскажете, примерно в каком направлении думать? Я так подозреваю, нужно будет парочку слотов писать, но в таком случае как привязать комбобоксы. Если я скажем захочу с третьего начать, затем в первом выбрать и только потом во втором.
Заранее благодарен.


UPD.
Сейчас подумал, что у самого комбобокса есть удаление элемента по индексу. Если скажем сделать один слот на все комбобоксы, на сигнал activated(int), то можно удалить у оставшихся этот элемент. Только как сделать одним слотом пока не представляю. Например, выбрал я во втором боксе элемент1, в первом и третьем его надо удалить. Выбрал я элемент4 в первом, во втором и третьем его надо удалить. Я научился ловить источник сигнала: QComboBox *_comboBox = qobject_cast<QComboBox *> (QObject::sender()); а как мне теперь обратиться к оставшимся - не знаю. Так же интересует другой момент. Скажем выбрал я элемент1 в боксе1. Но промазал (мышь чуток не довел), а хотел элемент2. При выборе элемент2, надо чтоб элемент1 вернулся во все боксы. Заранее благодарен.
« Последнее редактирование: Январь 13, 2015, 09:30 от vorotislav » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 13, 2015, 09:27 »

У QComboBox есть сигнал currentIndexChanged. Коннектишь сигнал от каждого комбобокса на один слот, в котором пробегаешь по всем комбобоксам и корректируешь их списки. Вот и все. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vorotislav
Гость
« Ответ #2 : Январь 13, 2015, 09:39 »

Пантер, но если пробегать по всем комбобоксам, таким способом можно и у нужного удалить элемент. Скажем, выбрал элемент с индексом 1. делаю слот:

Код:
void slotChangeItems(int index)
{
   cbPortName1->removeItem(index);
   cbPortName2->removeItem(index);
   cbPortName3->removeItem(index);
}
Записан
vorotislav
Гость
« Ответ #3 : Январь 13, 2015, 09:42 »

А если каждому комбобоксу назначить setObjectName, я же смогу в слоте определить objectName вызывающего комбобокса, и как следствие пройтись по оставшимся по таким же именам?
Записан
Bepec
Гость
« Ответ #4 : Январь 13, 2015, 09:54 »

If (QComboBox(sender()) != cbPortName1)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Январь 13, 2015, 10:15 »

If (QComboBox(sender()) != cbPortName1)
Верес, а кастить тут зачемНепонимающий

Код
C++ (Qt)
If (sender() != cbPortName1)
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Январь 13, 2015, 10:17 »

Пантер, но если пробегать по всем комбобоксам, таким способом можно и у нужного удалить элемент. Скажем, выбрал элемент с индексом 1. делаю слот:

Код:
void slotChangeItems(int index)
{
   cbPortName1->removeItem(index);
   cbPortName2->removeItem(index);
   cbPortName3->removeItem(index);
}
Только не индексом удаляй, а проанализируй айтемы.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #7 : Январь 13, 2015, 11:15 »

По привычке Улыбающийся
Записан
vorotislav
Гость
« Ответ #8 : Январь 14, 2015, 08:29 »

Всем спасибо! Сделал свой велосипед Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.153 секунд. Запросов: 23.