• QSortFilterProxyModel的简单用法


      参考<<C++ GUI Programming with Qt 4>>中文版第二版中的例子"ColorNamesDialog",简单介绍QSortFilterProxyModel的用法,QSortFilterProxyModel不能单独使用,它只是一个“代理”,真正的数据需要另外的一个model提供,而且它是用来排序和过滤的。

      colornamesdialog.h文件:

    #ifndef COLORNAMESDIALOG_H
    #define COLORNAMESDIALOG_H
    
    #include <QtGui/QDialog>
    #include <QSortFilterProxyModel>
    #include <QStringListModel>
    #include <QListView>
    #include <QComboBox>
    #include <QLineEdit>
    
    class ColorNamesDialog : public QDialog
    {
        Q_OBJECT
    
    public:
        ColorNamesDialog(QWidget *parent = 0);
        ~ColorNamesDialog();
    private slots:
        void reapplyFilter();
    private:
        QSortFilterProxyModel *proxyModel;
        QStringListModel *sourceModel;
        QListView *listView;
        QComboBox *syntaxComboBox;
        QLineEdit *filterLineEdit;
    };
    
    #endif

      colornamesdialog.cpp文件:

    #include "colornamesdialog.h"
    #include <QLabel>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    
    ColorNamesDialog::ColorNamesDialog(QWidget *parent)
        : QDialog(parent)
    {
        sourceModel = new QStringListModel(this);
        sourceModel->setStringList(QColor::colorNames());
    
        proxyModel = new QSortFilterProxyModel(this);
        proxyModel->setSourceModel(sourceModel);
        proxyModel->setFilterKeyColumn(0);
    
        listView = new QListView;
        listView->setModel(proxyModel);
    
        QLabel *filterLabel = new QLabel("Filter:", this);
        filterLabel->setFixedWidth(100);
        QLabel *patternLabel = new QLabel("Pattern syntax:", this);
        patternLabel->setFixedWidth(100);
    
        filterLineEdit = new QLineEdit(this);
        syntaxComboBox = new QComboBox(this);
        syntaxComboBox->addItem("Regular expression", QRegExp::RegExp); // QRegExp::RegExp   为 0
        syntaxComboBox->addItem("Wildcard", QRegExp::Wildcard);         // QRegExp::Wildcard 为 1
        syntaxComboBox->addItem("Fixed string", QRegExp::Wildcard);     // QRegExp::Wildcard 为 2
    
        QHBoxLayout *filterLayout = new QHBoxLayout;
        filterLayout->addWidget(filterLabel);
        filterLayout->addWidget(filterLineEdit);
    
        QHBoxLayout *patternLayout = new QHBoxLayout;
        patternLayout->addWidget(patternLabel);
        patternLayout->addWidget(syntaxComboBox);
    
        QVBoxLayout *mainLayout = new QVBoxLayout;
        mainLayout->addWidget(listView);
        mainLayout->addLayout(filterLayout);
        mainLayout->addLayout(patternLayout);
    
        setLayout(mainLayout);
        connect(syntaxComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(reapplyFilter()));
        connect(filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(reapplyFilter()));
    }
    
    ColorNamesDialog::~ColorNamesDialog()
    {
    }
    
    void ColorNamesDialog::reapplyFilter()
    {
        QRegExp::PatternSyntax syntax = QRegExp::PatternSyntax(syntaxComboBox->itemData(
                syntaxComboBox->currentIndex()).toInt());
        QRegExp regExp(filterLineEdit->text(), Qt::CaseInsensitive, syntax);
        proxyModel->setFilterRegExp(regExp);
    }

      main.cpp文件:

    #include <QtGui/QApplication>
    #include "colornamesdialog.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        ColorNamesDialog w;
        w.show();
        w.setWindowTitle("QSortFilterProxyModel Demo");
        return a.exec();
    }

      运行界面:

                                     

  • 相关阅读:
    Javascript 匿名函数与闭包
    Javascript 闭包的理解
    Javascript 函数及其执行环境和作用域
    JAVA generic array 泛型数组
    在Ubuntu 13.10 中安装配置 Hadoop 2.2.0
    Java 中文字符判断 中文标点符号判断
    当程序以Windows Services形式启动时当前路径不对
    .NET中Dictionary<TKey, TValue>浅析
    [趣文]单词间那无尽的等待
    DNS拾遗(二)
  • 原文地址:https://www.cnblogs.com/venow/p/2730049.html
Copyright © 2020-2023  润新知