【问题标题】:Editable QComboBox: synchronize edit text with item textEditable QComboBox:将编辑文本与项目文本同步
【发布时间】:2012-07-20 08:02:48
【问题描述】:

我有一个QComboBox,我想“自动”编辑它。也就是说,每次用户手动更改当前项目的文本时,该文本应该自动“落入”底层模型。

到目前为止,我已经通过自定义信号处理程序实现了这一点:

void setupUi() {
    ...
    connect( someComboBox,
             SIGNAL(editTextChanged(QString)),
             SLOT(comboBoxEditTextChanged(QString)) );
    ...
}

void comboBoxEditTextChanged( const QString& text ) {
    someComboBox->setItemText( someComboBox->currentIndex(), text );
}

所以我想知道,有没有可能用更少的代码做到这一点?我试过QComboBox::setInsertPolicy(QComboBox::InsertAtCurrent),但没有帮助。

编辑:当前具有自定义插槽的方法可以正常工作 - 但我想问是否有一种方法不涉及任何信号/插槽。

【问题讨论】:

  • 模型/视图模式的重点是视图(QComboBox)仅显示数据。因此,在您给定的示例中,您仅更改 QCombobox 内部缓冲区中的数据(不应更改模型)。您的插槽应该在模型上运行,而不是在视图上运行

标签: c++ qt user-interface qcombobox


【解决方案1】:

要在 USER 更改文本时自动设置文本,我们可以按如下方式编辑您的插槽:

void comboBoxEditTextChanged( const QString& text ) 
{
    int index = someComboBox->findText(text);
    if(index != -1)
    {
      someComboBox->setCurrentIndex(index);
     }
    someComboBox->setItemText( someComboBox->currentIndex(), text );
}

希望这能解决您的问题

【讨论】:

  • 这又不是...我希望用户输入的文本保存到当前索引下的模型中,因此无需搜索。此外,当前方法工作​​正常 - 但我想知道它是否可以在没有信号/插槽并且在每个字符输入处不复制字符串的情况下完成。
【解决方案2】:

QComboBox 可以使用手动添加项目

combo->additem("X"); 

combo->addItem(QString Y);

而您可以管理其中的最大项目数。请通过以下链接了解详细信息。

a link

所以,在你的位置,

void comboBoxEditTextChanged( const QString& text ) 
{
    someComboBox->addItem(text);
}

【讨论】:

  • 好吧,我不需要添加新项目,我只需要更改现有项目的文本 - 最好不使用自定义插槽。
  • @intelfx 这是我的错误。我没有正确阅读你的问题。那么我们可以按照以下方式进行 int index = combo->findText(text); if ( index != -1 ) { // -1 表示未找到 combo->setCurrentIndex(index); }
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多