Почему происходит сбой QComboBox::removeItem()

Я хочу удалить все элементы из QComboBox. Я попробовал это с этим кодом:

void refreshServiceComboBox(std::vector<QString> service){
   if ( !s_serviceComboBox->isVisible() ){
      s_serviceComboBox->setVisible( true );
   }

   int numberOfItems = s_serviceComboBox->count();

   for (int i = (numberOfItems-1); i >= 0 ; i--){
       s_serviceComboBox->removeItem(i);
   }


   for (int u = 0; u < service.size(); u++){
       std::cout << "Service: " << service[u].toStdString() << std::endl;   
   }

   // 
   for (unsigned int n = 0; n < service.size(); n++){
       s_serviceComboBox->addItem(service[n]);
   }
}

Первый вызов метода работает, но при втором вызове он не работает. Функция завершается вызовом "s_serviceComboBox->removeItem(i);" s_serviceComboBox — это элемент класса, созданный с помощью new. Кто-нибудь знает решение?

Редактировать:

Еще раз привет, проблема заключалась в том, что при вызове s_serviceComboBox->addItems программа переходит к соединению (Widget, SIGNAL(), Widget, SLOT()) и после этого возвращается к позиции s_serviceComboBox->addItems.. , Во время этого прыжка они переопределяют некоторые вещи. Когда я использую s_serviceComboBox->blockSignal(true) путем ввода функции и s_serviceComboBox->blockSignal(false), все работает без проблем. Спасибо за помощь! Кстати. Я использую ваш метод для обновления QComboBox


person Andreas    schedule 05.11.2013    source источник
comment
Что вы имеете в виду, когда говорите, что функция завершается?   -  person vipw    schedule 05.11.2013
comment
Все части после s_serviceComboBox-›removeItem(i) не будут выполняться   -  person Andreas    schedule 05.11.2013
comment
Вы должны перефразировать свой вопрос, чтобы спросить, почему происходит сбой QComboBox::removeItem(). Ответ будет заключаться в том, что вы не можете вызвать вызов removeItem() из сигнала, вызванного элементом. Это потому, что небезопасно уничтожать источник сигнала из слота.   -  person vipw    schedule 05.11.2013


Ответы (1)


Вам следует попробовать очистить поле со списком с помощью метода (слота) QComboBox::clear() описание очистить

А затем просто добавьте все элементы с QComboBox::addItems описанием addItems

void refreshServiceComboBox(const std::list<QString> &service) // better QStringList
{
    if (!s_serviceComboBox->isVisible())
        s_serviceComboBox->setVisible(true);

    s_serviceComboBox->clear();
    s_serviceComboBox->addItems(QList::fromStdList(service));
}
person Ruu    schedule 05.11.2013
comment
Я знаю, что вы имеете в виду, но я не дошел до части addItems, потому что вызов метода завершается, когда программа вызывает s_serviceComboBox-›clear(); Таким образом, addItems не будет выполняться. - person Andreas; 05.11.2013
comment
Вы имеете в виду sigfault под terminates ? Если это правда, вы разыменовываете NULL-указатель, но утверждаете, что isVisible() прошло. очень очень странно :) - person Ruu; 05.11.2013
comment
NULL-указатель невозможен, потому что я могу вызвать метод count(). Это действительно странно... - person Andreas; 05.11.2013
comment
Вы очищаете слот, вызываемый currentIndexChanged() или что-то подобное, того же поля со списком? Затем попробуйте отложить его (вернитесь к циклу событий раньше). См. также здесь: and-slots-in-qt/4889395#4889395" title="как работает удаление и удаление позже по отношению к сигналам и слотам в qt"> stackoverflow.com/questions/4888189/ - person Frank Osterfeld; 05.11.2013