Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按字母顺序更新和排序Qt组合框_C++_Qt_Sorting_Combobox - Fatal编程技术网

C++ 按字母顺序更新和排序Qt组合框

C++ 按字母顺序更新和排序Qt组合框,c++,qt,sorting,combobox,C++,Qt,Sorting,Combobox,我想写一个程序,像一个使用Qt框架的小导航系统一样工作,但我对它还是很陌生 我创建了一个带有两个组合框的对话框。每个组合框包含所有“citynames”。 初始化时,两个框的内容按字母顺序排序 如果选择了第一个框中的名称,则第二个框中不应显示该名称,反之亦然 如果选择了其他项目,我已成功删除该项目并再次添加,但我知道我无法再对其排序 这是我迄今为止尝试更新的内容: for(std::vector<City>::iterator iter = citylist.begin(); ite

我想写一个程序,像一个使用Qt框架的小导航系统一样工作,但我对它还是很陌生

我创建了一个带有两个组合框的对话框。每个组合框包含所有“citynames”。 初始化时,两个框的内容按字母顺序排序

如果选择了第一个框中的名称,则第二个框中不应显示该名称,反之亦然

如果选择了其他项目,我已成功删除该项目并再次添加,但我知道我无法再对其排序

这是我迄今为止尝试更新的内容:

for(std::vector<City>::iterator iter = citylist.begin(); iter != citylist.end(); iter++){
    if(ui->combo2->currentText() != (*iter).getName()
            and ui->combo1->findText((*iter).getName()) == -1){
        ui->combo1->addItem((*iter).getName(),QComboBox::InsertAlphabetically);
    }
}
但是如果我试图调用这个函数,就会发生错误,应用程序就会终止


有人能帮我吗?

您试图使用
QComboBox
的内部模型作为
代理的源模型。这将不起作用,因为
QComboBox
拥有其内部模型,当您调用
QComboBox::setModel
时,会删除以前的模型(尽管您重置了其父模型)。您需要创建一个单独的源模型。方便的是,如果城市列表相同,您可以为两个组合框使用一个源模型

使用
QSortFilterProxyModel
进行排序很容易,但要用它排除一个特定的字符串却异常困难。您可以子类化
QSortFilterProxyModel::filterAcceptsRow
并实现所需的行为。我决定用一点黑魔法来代替(参见)

私有类字段:

private:
  QSortFilterProxyModel *proxy1, *proxy2;
资料来源:

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  QStandardItemModel* model = new QStandardItemModel(this);
  foreach(QString name, QStringList()
      << "Paris"<< "London"<< "Moscow" << "Tokyo" << "Berlin" << "Amsterdam") {
    model->appendRow(new QStandardItem(name));
  }

  proxy1 = new QSortFilterProxyModel();
  proxy1->setSourceModel(model);
  proxy1->sort(0);
  ui->comboBox1->setModel(proxy1);

  proxy2 = new QSortFilterProxyModel();
  proxy2->setSourceModel(model);
  proxy2->sort(0);
  ui->comboBox2->setModel(proxy2);

  connect(ui->comboBox1, &QComboBox::currentTextChanged,
          this, &MainWindow::something_changed);
  connect(ui->comboBox2, &QComboBox::currentTextChanged,
          this, &MainWindow::something_changed);

  something_changed();
}

void MainWindow::something_changed() {
  ui->comboBox1->blockSignals(true); //prevent recursion
  ui->comboBox2->blockSignals(true);
  proxy2->setFilterRegExp(QString("^(?!(%1)$)").arg(
                          QRegExp::escape(ui->comboBox1->currentText())));
  proxy1->setFilterRegExp(QString("^(?!(%1)$)").arg(
                          QRegExp::escape(ui->comboBox2->currentText())));

  ui->comboBox1->blockSignals(false);
  ui->comboBox2->blockSignals(false);
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QStandardItemModel*model=新的QStandardItemModel(本);
foreach(QString名称,QStringList()
setSourceModel(模型);
proxy2->排序(0);
ui->comboBox2->setModel(proxy2);
连接(ui->Combox1,&QComboBox::currentTextChanged,
这,&main窗口::发生了一些变化);
连接(ui->Combox2,&QComboBox::currentTextChanged,
这,&main窗口::发生了一些变化);
有些东西改变了;
}
void主窗口::某些内容已更改(){
ui->comboBox1->blockSignals(true);//防止递归
ui->comboBox2->blockSignals(真);
proxy2->setFilterRegExp(QString(“^(?)(%1)$)”).arg(
QRegExp::escape(ui->comboBox1->currentText());
proxy1->setFilterRegExp(QString(“^(?)(%1)$)”).arg(
QRegExp::escape(ui->comboBox2->currentText());
ui->comboBox1->块信号(假);
ui->comboBox2->块信号(假);
}
在Qt5.3中测试。

您就快到了

ui.comboBox1.addItem("myitem");
// qApp->processEvents();  not really needed
ui.comboBox1.model()->sort(0);
ui.comboBox1.addItem("myitem");
// qApp->processEvents();  not really needed
ui.comboBox1.model()->sort(0);