Russian Qt Forum

Qt => Вопросы новичков => Тема начата: vorotislav от Январь 13, 2015, 09:16



Название: 3 QComboBox и 1 список
Отправлено: 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 вернулся во все боксы. Заранее благодарен.


Название: Re: 3 QComboBox и 1 список
Отправлено: Пантер от Январь 13, 2015, 09:27
У QComboBox есть сигнал currentIndexChanged. Коннектишь сигнал от каждого комбобокса на один слот, в котором пробегаешь по всем комбобоксам и корректируешь их списки. Вот и все. :)


Название: Re: 3 QComboBox и 1 список
Отправлено: vorotislav от Январь 13, 2015, 09:39
Пантер, но если пробегать по всем комбобоксам, таким способом можно и у нужного удалить элемент. Скажем, выбрал элемент с индексом 1. делаю слот:

Код:
void slotChangeItems(int index)
{
   cbPortName1->removeItem(index);
   cbPortName2->removeItem(index);
   cbPortName3->removeItem(index);
}


Название: Re: 3 QComboBox и 1 список
Отправлено: vorotislav от Январь 13, 2015, 09:42
А если каждому комбобоксу назначить setObjectName, я же смогу в слоте определить objectName вызывающего комбобокса, и как следствие пройтись по оставшимся по таким же именам?


Название: Re: 3 QComboBox и 1 список
Отправлено: Bepec от Январь 13, 2015, 09:54
If (QComboBox(sender()) != cbPortName1)


Название: Re: 3 QComboBox и 1 список
Отправлено: Пантер от Январь 13, 2015, 10:15
If (QComboBox(sender()) != cbPortName1)
Верес, а кастить тут зачем???

Код
C++ (Qt)
If (sender() != cbPortName1)
 


Название: Re: 3 QComboBox и 1 список
Отправлено: Пантер от Январь 13, 2015, 10:17
Пантер, но если пробегать по всем комбобоксам, таким способом можно и у нужного удалить элемент. Скажем, выбрал элемент с индексом 1. делаю слот:

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


Название: Re: 3 QComboBox и 1 список
Отправлено: Bepec от Январь 13, 2015, 11:15
По привычке :)


Название: Re: 3 QComboBox и 1 список
Отправлено: vorotislav от Январь 14, 2015, 08:29
Всем спасибо! Сделал свой велосипед :)