qt--颜色名称过滤应用程序(MVC)项-视图-控制类
//在这个项目里利用了像视图(MVC)类进行的,t中定义了好多项视图类QListWidget,QTableWidget,qtreewidget;
通常我们都是把数据嵌入项视图里面,但是对于对大数据图形展示,用这种就有点吃力了,因此利用qt自带了(MVC)类就有必要了。
QStringListModel 存储一个字符串列表
QStandardItenModel 存储任意分层次的数据
QDirModel 封装本地文件系统目录
QSortFilterProxyModel排序和筛选另一个模型
实现效果;列举颜色名称,通过输入框进行筛选颜色
//头文件
#ifndef COLORNAMESDIALOG_H
#define COLORNAMESDIALOG_H
#include <qtwidgets/QDialog>
#include <qtwidgets/QtWidgets>
class QComboBox;
class QLabel;
class QLineEdit;
class QListView;
class QSortFilterProxyModel;
class QStringListModel;
class ColorNamesDialog : public QDialog
{
Q_OBJECT
public:
ColorNamesDialog(QWidget *parent = 0);
private slots:
void reapplyFilter();
private:
QStringListModel *sourceModel;
QSortFilterProxyModel *proxyModel;
QListView *listView;
QLabel *filterLabel;
QLabel *syntaxLabel;
QLineEdit *filterLineEdit;
QComboBox *syntaxComboBox;
};
#endif
//源文件
#include <QtGui>
#include "colornamesdialog.h"
ColorNamesDialog::ColorNamesDialog(QWidget *parent)
: QDialog(parent)
{
sourceModel = new QStringListModel(this); //定义一个字符链表model
sourceModel->setStringList(QColor::colorNames()); //加入把所有的颜色名字到链表
proxyModel = new QSortFilterProxyModel(this); //设置排序类moduel
proxyModel->setSourceModel(sourceModel); //把stringmodel添加到procModel中
proxyModel->setFilterKeyColumn(0);
listView = new QListView; //创建一个qlistview用于展示model
listView->setModel(proxyModel); //生效
listView->setEditTriggers(QAbstractItemView::NoEditTriggers); //不可编辑
filterLabel = new QLabel(tr("&Filter:"));//添加两个label
filterLineEdit = new QLineEdit;
filterLabel->setBuddy(filterLineEdit);
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(filterLineEdit, SIGNAL(textChanged(const QString &)),
this, SLOT(reapplyFilter()));
//只要有改变就调reapplyFilter()函数进行筛选,具体进入函数内部了解
connect(syntaxComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(reapplyFilter()));
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(listView, 0, 0, 1, 2);
mainLayout->addWidget(filterLabel, 1, 0);
mainLayout->addWidget(filterLineEdit, 1, 1);
mainLayout->addWidget(syntaxLabel, 2, 0);
mainLayout->addWidget(syntaxComboBox, 2, 1);
setLayout(mainLayout);
setWindowTitle(tr("Color Names"));
}
void ColorNamesDialog::reapplyFilter()
{
QRegExp::PatternSyntax syntax = //定义qt正则表达式
QRegExp::PatternSyntax(syntaxComboBox->itemData(
syntaxComboBox->currentIndex()).toInt());
QRegExp regExp(filterLineEdit->text(), Qt::CaseInsensitive, syntax); //加载,大小写敏感
proxyModel->setFilterRegExp(regExp); //把proxymodes加载筛选性质
}
//主函数
#include <qtwidgets/QApplication>
#include "colornamesdialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ColorNamesDialog dialog;
dialog.show();
return app.exec();
}