Qt 5.5 使用 C++,从 ComboBox 中删除和项目正在删除项目之前的所有项目

Posted

技术标签:

【中文标题】Qt 5.5 使用 C++,从 ComboBox 中删除和项目正在删除项目之前的所有项目【英文标题】:Qt 5.5 using C++, removing and item from ComboBox is removing all items before the item as well 【发布时间】:2016-01-13 21:21:29 【问题描述】:

在 6 个组合框具有相关数据的程序上工作,一旦选择了一个索引,其他人就不应该选择它,因此我只是将它从其他人的索引中删除,但实际上它是出于某种原因删除索引加上它之前的每个索引。知道为什么吗?

void AssignStatsWindow::on_comboBox_currentIndexChanged()

    ui->comboBox_2->removeItem(ui->comboBox->currentIndex());  //these should remove 1 index but removes many
    ui->comboBox_3->removeItem(ui->comboBox->currentIndex());
    ui->comboBox_4->removeItem(ui->comboBox->currentIndex());
    ui->comboBox_5->removeItem(ui->comboBox->currentIndex());
    ui->comboBox_6->removeItem(ui->comboBox->currentIndex());

    for (int i = ui->comboBox->count(); i >= 0; --i) //removes all but newly selected index, seems to be working fine
    
        if (i != ui->comboBox->currentIndex()) 
            ui->comboBox->removeItem(i);
        
    

comboBox 是具有indexChanged 并触发代码的那个,comboBox_2 到 6 是其他需要调整并且是“过度删除”的索引。一旦我让第一个工作正常,为comboBoxes 的其余部分构建indexChanged 的其余部分应该很容易。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

来自Qt 5.5 documentation:

从组合框中删除给定索引处的项目。如果索引被删除,这将更新当前索引。


实际上,出于某种原因,它正在删除索引以及它之前的每个索引。知道为什么吗?

似乎删除项目的工作正在响应currentIndexChanged 信号的插槽中执行。上述文档指出,删除一个项目将更改组合框的当前索引,这将导致插槽被多次触发,从而删除许多项目。

【讨论】:

我明白了,所以我的 for 循环最后会导致更多的触发器,因为索引正在更改。这就说得通了。是时候想出一种新的方法来做到这一点了。 @StackAttack 我需要更多地了解所有信号和插槽是如何连接的,但是每个 QObject 上都有一个 blockSignals 函数,可以启用和禁用以处理情况与此类似。 我设法通过阅读更多来弄清楚 - “如果组合框的当前项目发生变化,则会发出两个信号,currentIndexChanged()和激活()。无论如何都会发出currentIndexChanged()如果更改是通过编程方式或通过用户交互完成的,则仅当更改是由用户交互引起时才发出 activate() 。” - 所以解决方案是简单地使用 activate() 而不是 currentIndexChanged() 和 wala,算法将继续工作。感谢您的帮助!

以上是关于Qt 5.5 使用 C++,从 ComboBox 中删除和项目正在删除项目之前的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

Qt Quick:如何从 ComboBox 获取当前文本

Python,Qt,ComboBox,两列?

Qt Quick:如何从ComboBox获取当前文本

OpenCV 从 VS2013 迁移到 QT 5.5

Qt 5.5 绘制指针

Qt 5.5 和 OpenGL:检索设备信息