如何使用Qt

时间:2017-04-18 12:37:39

标签: c++ qt qcombobox

我正在尝试改进我的UI以将两个组合框相互链接。

我的xml文件包含:

<DBInfo>
  <Info Org_Id="4" Database="ORACLE~orcl206~sample~2B3F1084DC06~~" />
  <Info Org_Id="5" Database="ORACLE~sample1~sample1~20E786F40DF7~~" />
</DBInfo>

我正在读取xml文件中的数据,并将所有org_Id(4,5)放在一个QStringList orgidlst中,并将所有数据库用户名(sample,sample1)放在另一个QStringList dbnamelst中。我正在使用这些字符串列表向两个QComboBoxes添加项目:

orgidcombobox.additems(orgidlst);
DBNamecombobox.additems(dbnamelst);

到目前为止工作正常,但现在如果我想将DBNamecombobox中的项目名称更改为sample1,那么orgidcombobox应为5,如果我更改{ {1}}到orgidcombobox,然后4将变为DBNamecombobox反之。

1 个答案:

答案 0 :(得分:1)

来自 ni1ight 的评论是一个很好的解决方案(我为了完整性而在最后复制它)。另一方面,如果您的组合框已排序,那么您必须使用更复杂的东西。我发现使用项目数据存储数据库密钥然后使用它来查找任何元素是有用的,即使索引不再匹配:

for (int ii = 0; ii < orgidlst.count(); ++ii) {
  comboBox1->addItem(orgidlst[ii], orgidlst[ii]);
  comboBox2->addItem(dbnamelst[ii], orgidlst[ii]);
}

connect(comboBox1, SIGNAL(currentIndexChanged(int)), SLOT(onComboIndexChanged(int)));
connect(comboBox2, SIGNAL(currentIndexChanged(int)), SLOT(onComboIndexChanged(int)));

公共插槽可能看起来像下面的代码,魔术位于QComboBox::findData方法中:

void YourClass::onComboIndexChanged(int) {
  // Find the current and the other combo
  auto the_combo = qobject_cast<QComboBox*>(sender());
  if (combo1 == nullptr) return;
  auto the_other_combo = the_combo == comboBox1 ? comboBox2 : comboBox1;

  const int the_other_index = the_combo->findData(the_combo->currentData());
  the_other_combo->setCurrentIndex(the_other_index);
}

ni1ight解决方案

如果两个组合框都保留元素排序,则无效:

connect(comboBox1, SIGNAL(currentIndexChanged(int)), comboBox2, SLOT(setCurrentIndex(int)));
connect(comboBox2, SIGNAL(currentIndexChanged(int)), comboBox1, SLOT(setCurrentIndex(int)));