【问题标题】:Why does QComboBox::removeItem() crash为什么 QComboBox::removeItem() 崩溃
【发布时间】:2013-11-05 09:26:42
【问题描述】:

我想从 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 时程序跳转到 connect(Widget, SIGNAL(), Widget, SLOT()) 执行此操作并在此之后跳回 s_serviceComboBox->addItems 的位置... 在此期间跳转他们覆盖一些东西。当我通过输入函数使用 s_serviceComboBox->blockSignal(true) 和 s_serviceComboBox->blockSignal(false) 时,它可以正常工作 感谢帮助! 顺便提一句。我用你这种方法来刷新 QComboBox

【问题讨论】:

  • 你说函数终止是什么意思?
  • "s_serviceComboBox->removeItem(i) 之后的所有部分都不会被执行
  • 你应该改写你的问题,问为什么 QComboBox::removeItem() 崩溃。答案是您不能从项目引起的信号中调用 removeItem() 调用。那是因为从插槽中破坏信号源是不安全的。

标签: qt qcombobox


【解决方案1】:

您应该尝试使用方法(插槽)QComboBox::clear()description clear 清除组合框

然后简单地将所有项目附加QComboBox::addItems description 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));
}

【讨论】:

  • 我知道你在说什么,但我没有来到 addItems 部分,因为方法调用在程序调用 s_serviceComboBox->clear(); 时终止;所以 addItems 不会被执行..
  • 你的意思是terminates下的sigfault吗?如果这是真的,您取消引用 NULL 指针,但您声称 isVisible() 已通过。非常非常奇怪:)
  • NULL-pointer 是不可能的,因为我可以调用 count() 方法.. 真的很奇怪...
  • 您是否正在清除由 currentIndexChanged() 或类似名称调用的相同组合框的插槽?然后尝试延迟它(返回之前的事件循环)参见这里:stackoverflow.com/questions/4888189/…
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多