Add clear button and side action to customsortfiltermodel example.
Demonstrate the new side widgets feature of QLineEdit. Change-Id: I1c4289c652abf2209e50601871249008fdec4f6b Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>bb10
parent
9ee4a12193
commit
23964bc338
|
|
@ -1,10 +1,14 @@
|
|||
QT += widgets
|
||||
|
||||
HEADERS = mysortfilterproxymodel.h \
|
||||
window.h
|
||||
window.h \
|
||||
filterwidget.h
|
||||
SOURCES = main.cpp \
|
||||
mysortfilterproxymodel.cpp \
|
||||
window.cpp
|
||||
window.cpp \
|
||||
filterwidget.cpp
|
||||
|
||||
RESOURCES += customsortfiltermodel.qrc
|
||||
|
||||
# install
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/itemviews/customsortfiltermodel
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource prefix="/">
|
||||
<file>images/find.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the examples of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
|
||||
** of its contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "filterwidget.h"
|
||||
|
||||
#include <QIcon>
|
||||
#include <QPixmap>
|
||||
#include <QImage>
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
#include <QActionGroup>
|
||||
#include <QToolButton>
|
||||
#include <QWidgetAction>
|
||||
#include <QDebug>
|
||||
|
||||
FilterWidget::FilterWidget(QWidget *parent)
|
||||
: QLineEdit(parent)
|
||||
, m_patternGroup(new QActionGroup(this))
|
||||
{
|
||||
setClearButtonEnabled(true);
|
||||
connect(this, SIGNAL(textChanged(QString)), this, SIGNAL(filterChanged()));
|
||||
|
||||
QMenu *menu = new QMenu(this);
|
||||
m_caseSensitivityAction = menu->addAction(tr("Case Sensitive"));
|
||||
m_caseSensitivityAction->setCheckable(true);
|
||||
connect(m_caseSensitivityAction, SIGNAL(toggled(bool)), this, SIGNAL(filterChanged()));
|
||||
|
||||
menu->addSeparator();
|
||||
m_patternGroup->setExclusive(true);
|
||||
QAction *patternAction = menu->addAction("Fixed String");
|
||||
patternAction->setData(QVariant(int(QRegExp::FixedString)));
|
||||
patternAction->setCheckable(true);
|
||||
patternAction->setChecked(true);
|
||||
m_patternGroup->addAction(patternAction);
|
||||
patternAction = menu->addAction("Regular Expression");
|
||||
patternAction->setCheckable(true);
|
||||
patternAction->setData(QVariant(int(QRegExp::RegExp2)));
|
||||
m_patternGroup->addAction(patternAction);
|
||||
patternAction = menu->addAction("Wildcard");
|
||||
patternAction->setCheckable(true);
|
||||
patternAction->setData(QVariant(int(QRegExp::Wildcard)));
|
||||
m_patternGroup->addAction(patternAction);
|
||||
connect(m_patternGroup, SIGNAL(triggered(QAction*)), this, SIGNAL(filterChanged()));
|
||||
|
||||
const QIcon icon = QIcon(QPixmap(":/images/find.png"));
|
||||
QToolButton *optionsButton = new QToolButton;
|
||||
optionsButton->setCursor(Qt::ArrowCursor);
|
||||
optionsButton->setFocusPolicy(Qt::NoFocus);
|
||||
optionsButton->setStyleSheet("* { border: none; }");
|
||||
optionsButton->setIcon(icon);
|
||||
optionsButton->setMenu(menu);
|
||||
optionsButton->setPopupMode(QToolButton::InstantPopup);
|
||||
|
||||
QWidgetAction *optionsAction = new QWidgetAction(this);
|
||||
optionsAction->setDefaultWidget(optionsButton);
|
||||
addAction(optionsAction, QLineEdit::LeadingPosition);
|
||||
}
|
||||
|
||||
Qt::CaseSensitivity FilterWidget::caseSensitivity() const
|
||||
{
|
||||
return m_caseSensitivityAction->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
|
||||
}
|
||||
|
||||
void FilterWidget::setCaseSensitivity(Qt::CaseSensitivity cs)
|
||||
{
|
||||
m_caseSensitivityAction->setChecked(cs == Qt::CaseSensitive);
|
||||
}
|
||||
|
||||
static inline QRegExp::PatternSyntax patternSyntaxFromAction(const QAction *a)
|
||||
{
|
||||
return static_cast<QRegExp::PatternSyntax>(a->data().toInt());
|
||||
}
|
||||
|
||||
QRegExp::PatternSyntax FilterWidget::patternSyntax() const
|
||||
{
|
||||
return patternSyntaxFromAction(m_patternGroup->checkedAction());
|
||||
}
|
||||
|
||||
void FilterWidget::setPatternSyntax(QRegExp::PatternSyntax s)
|
||||
{
|
||||
foreach (QAction *a, m_patternGroup->actions()) {
|
||||
if (patternSyntaxFromAction(a) == s) {
|
||||
a->setChecked(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the examples of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:BSD$
|
||||
** You may use this file under the terms of the BSD license as follows:
|
||||
**
|
||||
** "Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
|
||||
** of its contributors may be used to endorse or promote products derived
|
||||
** from this software without specific prior written permission.
|
||||
**
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef FILTERWIDGET_H
|
||||
#define FILTERWIDGET_H
|
||||
|
||||
#include <QLineEdit>
|
||||
#include <QRegExp>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QAction;
|
||||
class QActionGroup;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
Q_DECLARE_METATYPE(QRegExp::PatternSyntax)
|
||||
|
||||
class FilterWidget : public QLineEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(Qt::CaseSensitivity caseSensitivity READ caseSensitivity WRITE setCaseSensitivity)
|
||||
Q_PROPERTY(QRegExp::PatternSyntax patternSyntax READ patternSyntax WRITE setPatternSyntax)
|
||||
public:
|
||||
explicit FilterWidget(QWidget *parent = 0);
|
||||
|
||||
Qt::CaseSensitivity caseSensitivity() const;
|
||||
void setCaseSensitivity(Qt::CaseSensitivity);
|
||||
|
||||
QRegExp::PatternSyntax patternSyntax() const;
|
||||
void setPatternSyntax(QRegExp::PatternSyntax);
|
||||
|
||||
signals:
|
||||
void filterChanged();
|
||||
|
||||
private:
|
||||
QAction *m_caseSensitivityAction;
|
||||
QActionGroup *m_patternGroup;
|
||||
};
|
||||
|
||||
#endif // FILTERWIDGET_H
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 737 B |
|
|
@ -42,6 +42,7 @@
|
|||
|
||||
#include "mysortfilterproxymodel.h"
|
||||
#include "window.h"
|
||||
#include "filterwidget.h"
|
||||
|
||||
//! [0]
|
||||
Window::Window()
|
||||
|
|
@ -63,19 +64,12 @@ Window::Window()
|
|||
//! [2]
|
||||
|
||||
//! [3]
|
||||
filterCaseSensitivityCheckBox = new QCheckBox(tr("Case sensitive filter"));
|
||||
filterCaseSensitivityCheckBox->setChecked(true);
|
||||
|
||||
filterPatternLineEdit = new QLineEdit;
|
||||
filterPatternLineEdit->setText("Grace|Sports");
|
||||
filterWidget = new FilterWidget;
|
||||
filterWidget->setText("Grace|Sports");
|
||||
connect(filterWidget, SIGNAL(filterChanged()), this, SLOT(textFilterChanged()));
|
||||
|
||||
filterPatternLabel = new QLabel(tr("&Filter pattern:"));
|
||||
filterPatternLabel->setBuddy(filterPatternLineEdit);
|
||||
|
||||
filterSyntaxComboBox = new QComboBox;
|
||||
filterSyntaxComboBox->addItem(tr("Regular expression"), QRegExp::RegExp);
|
||||
filterSyntaxComboBox->addItem(tr("Wildcard"), QRegExp::Wildcard);
|
||||
filterSyntaxComboBox->addItem(tr("Fixed string"), QRegExp::FixedString);
|
||||
filterPatternLabel->setBuddy(filterWidget);
|
||||
|
||||
fromDateEdit = new QDateEdit;
|
||||
fromDateEdit->setDate(QDate(1970, 01, 01));
|
||||
|
|
@ -87,11 +81,7 @@ Window::Window()
|
|||
toLabel = new QLabel(tr("&To:"));
|
||||
toLabel->setBuddy(toDateEdit);
|
||||
|
||||
connect(filterPatternLineEdit, SIGNAL(textChanged(QString)),
|
||||
this, SLOT(textFilterChanged()));
|
||||
connect(filterSyntaxComboBox, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(textFilterChanged()));
|
||||
connect(filterCaseSensitivityCheckBox, SIGNAL(toggled(bool)),
|
||||
connect(filterWidget, SIGNAL(textChanged(QString)),
|
||||
this, SLOT(textFilterChanged()));
|
||||
connect(fromDateEdit, SIGNAL(dateChanged(QDate)),
|
||||
this, SLOT(dateFilterChanged()));
|
||||
|
|
@ -111,9 +101,7 @@ Window::Window()
|
|||
QGridLayout *proxyLayout = new QGridLayout;
|
||||
proxyLayout->addWidget(proxyView, 0, 0, 1, 3);
|
||||
proxyLayout->addWidget(filterPatternLabel, 1, 0);
|
||||
proxyLayout->addWidget(filterPatternLineEdit, 1, 1);
|
||||
proxyLayout->addWidget(filterSyntaxComboBox, 1, 2);
|
||||
proxyLayout->addWidget(filterCaseSensitivityCheckBox, 2, 0, 1, 3);
|
||||
proxyLayout->addWidget(filterWidget, 1, 1);
|
||||
proxyLayout->addWidget(fromLabel, 3, 0);
|
||||
proxyLayout->addWidget(fromDateEdit, 3, 1, 1, 2);
|
||||
proxyLayout->addWidget(toLabel, 4, 0);
|
||||
|
|
@ -145,14 +133,9 @@ void Window::setSourceModel(QAbstractItemModel *model)
|
|||
//! [8]
|
||||
void Window::textFilterChanged()
|
||||
{
|
||||
QRegExp::PatternSyntax syntax =
|
||||
QRegExp::PatternSyntax(filterSyntaxComboBox->itemData(
|
||||
filterSyntaxComboBox->currentIndex()).toInt());
|
||||
Qt::CaseSensitivity caseSensitivity =
|
||||
filterCaseSensitivityCheckBox->isChecked() ? Qt::CaseSensitive
|
||||
: Qt::CaseInsensitive;
|
||||
|
||||
QRegExp regExp(filterPatternLineEdit->text(), caseSensitivity, syntax);
|
||||
QRegExp regExp(filterWidget->text(),
|
||||
filterWidget->caseSensitivity(),
|
||||
filterWidget->patternSyntax());
|
||||
proxyModel->setFilterRegExp(regExp);
|
||||
}
|
||||
//! [8]
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ class QLineEdit;
|
|||
class QTreeView;
|
||||
QT_END_NAMESPACE
|
||||
class MySortFilterProxyModel;
|
||||
|
||||
class FilterWidget;
|
||||
//! [0]
|
||||
class Window : public QWidget
|
||||
{
|
||||
|
|
@ -76,12 +76,10 @@ private:
|
|||
QGroupBox *proxyGroupBox;
|
||||
QTreeView *sourceView;
|
||||
QTreeView *proxyView;
|
||||
QCheckBox *filterCaseSensitivityCheckBox;
|
||||
QLabel *filterPatternLabel;
|
||||
QLabel *fromLabel;
|
||||
QLabel *toLabel;
|
||||
QLineEdit *filterPatternLineEdit;
|
||||
QComboBox *filterSyntaxComboBox;
|
||||
FilterWidget *filterWidget;
|
||||
QDateEdit *fromDateEdit;
|
||||
QDateEdit *toDateEdit;
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue