Use QLineEdit built-in ClearButton (Qt5 only)

This commit is contained in:
Chocobo1 2015-11-07 12:34:52 +08:00
parent a16d0f8d28
commit 0eaf991d6f
3 changed files with 39 additions and 22 deletions

View file

@ -8,21 +8,28 @@
****************************************************************************/
#include "lineedit.h"
#include <QToolButton>
#include <algorithm>
#include <QStyle>
#include <QtDebug>
#include <QToolButton>
#include <QResizeEvent>
LineEdit::LineEdit(QWidget *parent)
: QLineEdit(parent)
{
searchButton = new QToolButton(this);
int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
QPixmap pixmap1(":/lineeditimages/search.png");
searchButton = new QToolButton(this);
searchButton->setIcon(QIcon(pixmap1));
searchButton->setIconSize(pixmap1.size());
searchButton->setCursor(Qt::ArrowCursor);
searchButton->setStyleSheet("QToolButton { border: none; padding: 2px; }");
clearButton = new QToolButton(this);
int clearButtonSizeHintWidth = 0;
int clearButtonSizeHintHeight = 0;
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
QPixmap pixmap2(":/lineeditimages/clear_left.png");
clearButton = new QToolButton(this);
clearButton->setIcon(QIcon(pixmap2));
clearButton->setIconSize(pixmap2.size());
clearButton->setCursor(Qt::ArrowCursor);
@ -31,25 +38,35 @@ LineEdit::LineEdit(QWidget *parent)
clearButton->hide();
connect(clearButton, SIGNAL(clicked()), this, SLOT(clear()));
connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(updateCloseButton(const QString&)));
int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
setStyleSheet(QString("QLineEdit { padding-right: %1px; padding-left: %2px; }").arg(clearButton->sizeHint().width() + frameWidth + 1).arg(clearButton->sizeHint().width() + frameWidth + 1));
QSize msz = minimumSizeHint();
setMinimumSize(qMax(msz.width(), clearButton->sizeHint().width() + searchButton->sizeHint().width() + frameWidth * 2 + 2),
qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2));
clearButtonSizeHintWidth = clearButton->sizeHint().width();
clearButtonSizeHintHeight = clearButton->sizeHint().height();
setStyleSheet(QString("QLineEdit { padding-left: %1px; padding-right: %2px; }").arg(searchButton->sizeHint().width()).arg(clearButtonSizeHintWidth));
#else
setClearButtonEnabled(true);
setStyleSheet(QString("QLineEdit { padding-left: %1px; }").arg(searchButton->sizeHint().width())); // padding between text and widget borders
#endif
QSize msz = sizeHint();
setMinimumSize(qMax(msz.width(), searchButton->sizeHint().width() + clearButtonSizeHintWidth),
std::max({ msz.height(), searchButton->sizeHint().height(), clearButtonSizeHintHeight }) + frameWidth * 2);
}
void LineEdit::resizeEvent(QResizeEvent *)
void LineEdit::resizeEvent(QResizeEvent *e)
{
QSize sz = searchButton->sizeHint();
int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
searchButton->move(rect().left() + frameWidth, (rect().bottom() + 2 - sz.height())/2);
sz = clearButton->sizeHint();
clearButton->move(rect().right() - frameWidth - sz.width(),
(rect().bottom() + 2 - sz.height())/2);
QSize sz = searchButton->sizeHint();
searchButton->move(frameWidth, (e->size().height() - sz.height()) / 2);
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
QSize cz = clearButton->sizeHint();
clearButton->move((e->size().width() - frameWidth - cz.width()), (e->size().height() - sz.height()) / 2);
#endif
}
void LineEdit::updateCloseButton(const QString& text)
{
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
clearButton->setVisible(!text.isEmpty());
#endif
}

View file

@ -12,26 +12,26 @@
#include <QLineEdit>
QT_BEGIN_NAMESPACE
class QToolButton;
QT_END_NAMESPACE
class LineEdit : public QLineEdit
{
Q_OBJECT
public:
LineEdit(QWidget *parent = 0);
LineEdit(QWidget *parent);
protected:
void resizeEvent(QResizeEvent *);
void resizeEvent(QResizeEvent *e);
private slots:
void updateCloseButton(const QString &text);
private:
QToolButton *clearButton;
QToolButton *searchButton;
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
QToolButton *clearButton;
#endif
};
#endif // LIENEDIT_H

View file

@ -64,7 +64,7 @@
/*SEARCH ENGINE START*/
SearchEngine::SearchEngine(MainWindow* parent)
: QWidget(parent)
, search_pattern(new LineEdit)
, search_pattern(new LineEdit(this))
, mp_mainWindow(parent)
{
setupUi(this);