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

View file

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

View file

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