Qt学习:项视图类之QSortFilterProxyModel和QListWidget

    QSortFilterProxyModel是一个方便我们对模型操作(排序)的类,它是这样工作的:QSortFilterProxyModel封装一个已经存在的模型,我们可以把这个模型叫做源模型,即源模型为QSortFilterProxyModel提供数据,QSortFilterProxyModel利用视图类来观察源模型的数据并提供对源模型的数据的操作。其实就如这个类的名字说的那样,它只是一个“代理”,源模型通过它来“过滤”数据。
    我们直接给图:

 

    以下是构造函数部分的代码:

SortDialog::SortDialog(QWidget *parent)
    : QDialog(parent)
{
    sourceModel = new QStringListModel(QColor::colorNames(), this);

    proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setSourceModel(sourceModel);
    proxyModel->setFilterKeyColumn(0);

    listView = new QListView;
    listView->setModel(proxyModel);

    filterLabel = new QLabel(tr("&Filter:"));
    filterEdit = new QLineEdit;
    filterLabel->setBuddy(filterEdit);

    syntaxLabel = new QLabel(tr("&Pattern syntax:"));
    syntaxComboBox = new QComboBox;
    syntaxComboBox->addItem(tr("Regular expression"), QRegExp::RegExp);
    syntaxComboBox->addItem(tr("Wildcard"), QRegExp::Wildcard);
    syntaxComboBox->addItem(tr("Fixed string"), QRegExp::FixedString);
    syntaxLabel->setBuddy(syntaxComboBox);

    connect(filterEdit, SIGNAL(textChanged(QString)), this, SLOT(filter()));
    connect(syntaxComboBox, SIGNAL(currentIndexChanged(int)),
            this, SLOT(filter()));

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(listView, 0, 0, 1, 2);
    layout->addWidget(filterLabel, 1, 0);
    layout->addWidget(filterEdit, 1, 1);
    layout->addWidget(syntaxLabel, 2, 0);
    layout->addWidget(syntaxComboBox, 2, 1);
    setLayout(layout);

    setWindowTitle(tr("QSortFilterDialog"));
}


 

    首先我们创建了一个源模型,这里是QStringListModel,并用颜色的名字初始化这个模型。
    然后我们创建一个代理模型,并用proxyModel->setSourceModel(sourceModel);建立起源模型和代理模型的关联。
    接着用QListView去观察这个模型。
    QComboBox::addItem()函数接收一个类型为QVariant的可选数据参数,我们使用它存储和没一个项文本对应的QRegExp::PatternSyntax值。

void SortDialog::filter()
{
    QRegExp::PatternSyntax syntax =
            QRegExp::PatternSyntax(syntaxComboBox->itemData(
                                       syntaxComboBox->currentIndex()).toInt());
    QRegExp regExp(filterEdit->text(), Qt::CaseInsensitive, syntax);
    proxyModel->setFilterRegExp(regExp);
}

 


    filter()私有槽当行编辑器或者下拉列表框的内容发生改变的时候,根据其语法规则对数据进行过滤。使用QComboBox的选择值创建一个QRegExp::PatternSyntax对象,然后利用这个语法规则构造一个正则表达式,注意我们在QLineEdit里面输入的内容是通过参数传递进来的,然后设置proxy的过滤器的表达式。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值