|
| 1 | +#include "FilterLineEdit.h" |
| 2 | + |
| 3 | +#include <QTimer> |
| 4 | +#include <QKeyEvent> |
| 5 | + |
| 6 | +FilterLineEdit::FilterLineEdit(QWidget* parent, QList<FilterLineEdit*>* filters, int columnnum) : QLineEdit(parent), filterList(filters), columnNumber(columnnum) |
| 7 | +{ |
| 8 | + setPlaceholderText(tr("Filter")); |
| 9 | +#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) |
| 10 | + setClearButtonEnabled(true); |
| 11 | +#endif |
| 12 | + setProperty("column", columnnum); // Store the column number for later use |
| 13 | + |
| 14 | + // Introduce a timer for delaying the signal triggered whenever the user changes the filter value. |
| 15 | + // The idea here is that the textChanged() event isn't connected to the update filter slot directly anymore |
| 16 | + // but instead there this timer mechanism in between: whenever the user changes the filter the delay timer |
| 17 | + // is (re)started. As soon as the user stops typing the timer has a chance to trigger and call the |
| 18 | + // delayedSignalTimerTriggered() method which then stops the timer and emits the delayed signal. |
| 19 | + delaySignalTimer = new QTimer(this); |
| 20 | + delaySignalTimer->setInterval(300); // This is the milliseconds of not-typing we want to wait before triggering |
| 21 | + connect(this, SIGNAL(textChanged(QString)), delaySignalTimer, SLOT(start())); |
| 22 | + connect(delaySignalTimer, SIGNAL(timeout()), this, SLOT(delayedSignalTimerTriggered())); |
| 23 | + |
| 24 | + // Immediately emit the delayed filter value changed signal if the user presses the enter or the return key or |
| 25 | + // the line edit widget loses focus |
| 26 | + connect(this, SIGNAL(editingFinished()), this, SLOT(delayedSignalTimerTriggered())); |
| 27 | +} |
| 28 | + |
| 29 | +void FilterLineEdit::delayedSignalTimerTriggered() |
| 30 | +{ |
| 31 | + // Stop the timer first to avoid triggering in intervals |
| 32 | + delaySignalTimer->stop(); |
| 33 | + |
| 34 | + // Emit the delayed signal using the current value |
| 35 | + emit delayedTextChanged(text()); |
| 36 | +} |
| 37 | + |
| 38 | +void FilterLineEdit::keyReleaseEvent(QKeyEvent* event) |
| 39 | +{ |
| 40 | + if(event->key() == Qt::Key_Tab) |
| 41 | + { |
| 42 | + if(columnNumber < filterList->size() - 1) |
| 43 | + { |
| 44 | + filterList->at(columnNumber + 1)->setFocus(); |
| 45 | + event->accept(); |
| 46 | + } |
| 47 | + } else if(event->key() == Qt::Key_Backtab) { |
| 48 | + if(columnNumber > 0) |
| 49 | + { |
| 50 | + filterList->at(columnNumber - 1)->setFocus(); |
| 51 | + event->accept(); |
| 52 | + } |
| 53 | + } |
| 54 | +} |
| 55 | + |
| 56 | +void FilterLineEdit::clear() |
| 57 | +{ |
| 58 | + // When programatically clearing the line edit's value make sure the effects are applied immediately, i.e. |
| 59 | + // bypass the delayed signal timer |
| 60 | + QLineEdit::clear(); |
| 61 | + delayedSignalTimerTriggered(); |
| 62 | +} |
| 63 | + |
| 64 | +void FilterLineEdit::setText(const QString& text) |
| 65 | +{ |
| 66 | + // When programatically setting the line edit's value make sure the effects are applied immediately, i.e. |
| 67 | + // bypass the delayed signal timer |
| 68 | + QLineEdit::setText(text); |
| 69 | + delayedSignalTimerTriggered(); |
| 70 | +} |
0 commit comments