您正在尝试使用QComboBox的内部模型作为proxy源模型。 这不起作用,因为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);
}
在Qt 5.3中测试过。