searchlineedit.cpp
上传用户:huahtool
上传日期:2015-12-10
资源大小:1089k
文件大小:8k
源码类别:

浏览器

开发平台:

Visual C++

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the demonstration applications of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #include "searchlineedit.h"
  38. #include <QtGui/QPainter>
  39. #include <QtGui/QMouseEvent>
  40. #include <QtGui/QMenu>
  41. #include <QtGui/QStyle>
  42. #include <QtGui/QStyleOptionFrameV2>
  43. ClearButton::ClearButton(QWidget *parent)
  44.   : QAbstractButton(parent)
  45. {
  46.     setCursor(Qt::ArrowCursor);
  47.     setToolTip(tr("Clear"));
  48.     setVisible(false);
  49.     setFocusPolicy(Qt::NoFocus);
  50. }
  51. void ClearButton::paintEvent(QPaintEvent *event)
  52. {
  53.     Q_UNUSED(event);
  54.     QPainter painter(this);
  55.     int height = this->height();
  56.     painter.setRenderHint(QPainter::Antialiasing, true);
  57.     QColor color = palette().color(QPalette::Mid);
  58.     painter.setBrush(isDown()
  59.                      ? palette().color(QPalette::Dark)
  60.                      : palette().color(QPalette::Mid));
  61.     painter.setPen(painter.brush().color());
  62.     int size = width();
  63.     int offset = size / 5;
  64.     int radius = size - offset * 2;
  65.     painter.drawEllipse(offset, offset, radius, radius);
  66.     painter.setPen(palette().color(QPalette::Base));
  67.     int border = offset * 2;
  68.     painter.drawLine(border, border, width() - border, height - border);
  69.     painter.drawLine(border, height - border, width() - border, border);
  70. }
  71. void ClearButton::textChanged(const QString &text)
  72. {
  73.     setVisible(!text.isEmpty());
  74. }
  75. /*
  76.     Search icon on the left hand side of the search widget
  77.     When a menu is set a down arrow appears
  78.  */
  79. class SearchButton : public QAbstractButton {
  80. public:
  81.     SearchButton(QWidget *parent = 0);
  82.     void paintEvent(QPaintEvent *event);
  83.     QMenu *m_menu;
  84. protected:
  85.     void mousePressEvent(QMouseEvent *event);
  86. };
  87. SearchButton::SearchButton(QWidget *parent)
  88.   : QAbstractButton(parent),
  89.     m_menu(0)
  90. {
  91.     setObjectName(QLatin1String("SearchButton"));
  92.     setCursor(Qt::ArrowCursor);
  93.     setFocusPolicy(Qt::NoFocus);
  94. }
  95. void SearchButton::mousePressEvent(QMouseEvent *event)
  96. {
  97.     if (m_menu && event->button() == Qt::LeftButton) {
  98.         QWidget *p = parentWidget();
  99.         if (p) {
  100.             QPoint r = p->mapToGlobal(QPoint(0, p->height()));
  101.             m_menu->exec(QPoint(r.x() + height() / 2, r.y()));
  102.         }
  103.         event->accept();
  104.     }
  105.     QAbstractButton::mousePressEvent(event);
  106. }
  107. void SearchButton::paintEvent(QPaintEvent *event)
  108. {
  109.     Q_UNUSED(event);
  110.     QPainterPath myPath;
  111.     int radius = (height() / 5) * 2;
  112.     QRect circle(height() / 3 - 1, height() / 4, radius, radius);
  113.     myPath.addEllipse(circle);
  114.     myPath.arcMoveTo(circle, 300);
  115.     QPointF c = myPath.currentPosition();
  116.     int diff = height() / 7;
  117.     myPath.lineTo(qMin(width() - 2, (int)c.x() + diff), c.y() + diff);
  118.     QPainter painter(this);
  119.     painter.setRenderHint(QPainter::Antialiasing, true);
  120.     painter.setPen(QPen(Qt::darkGray, 2));
  121.     painter.drawPath(myPath);
  122.     if (m_menu) {
  123.         QPainterPath dropPath;
  124.         dropPath.arcMoveTo(circle, 320);
  125.         QPointF c = dropPath.currentPosition();
  126.         c = QPointF(c.x() + 3.5, c.y() + 0.5);
  127.         dropPath.moveTo(c);
  128.         dropPath.lineTo(c.x() + 4, c.y());
  129.         dropPath.lineTo(c.x() + 2, c.y() + 2);
  130.         dropPath.closeSubpath();
  131.         painter.setPen(Qt::darkGray);
  132.         painter.setBrush(Qt::darkGray);
  133.         painter.setRenderHint(QPainter::Antialiasing, false);
  134.         painter.drawPath(dropPath);
  135.     }
  136.     painter.end();
  137. }
  138. /*
  139.     SearchLineEdit is an enhanced QLineEdit
  140.     - A Search icon on the left with optional menu
  141.     - When there is no text and doesn't have focus an "inactive text" is displayed
  142.     - When there is text a clear button is displayed on the right hand side
  143.  */
  144. SearchLineEdit::SearchLineEdit(QWidget *parent) : ExLineEdit(parent),
  145.     m_searchButton(new SearchButton(this))
  146. {
  147.     connect(lineEdit(), SIGNAL(textChanged(const QString &)),
  148.             this, SIGNAL(textChanged(const QString &)));
  149.     setLeftWidget(m_searchButton);
  150.     m_inactiveText = tr("Search");
  151.     QSizePolicy policy = sizePolicy();
  152.     setSizePolicy(QSizePolicy::Preferred, policy.verticalPolicy());
  153. }
  154. void SearchLineEdit::paintEvent(QPaintEvent *event)
  155. {
  156.     if (lineEdit()->text().isEmpty() && !hasFocus() && !m_inactiveText.isEmpty()) {
  157.         ExLineEdit::paintEvent(event);
  158.         QStyleOptionFrameV2 panel;
  159.         initStyleOption(&panel);
  160.         QRect r = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
  161.         QFontMetrics fm = fontMetrics();
  162.         int horizontalMargin = lineEdit()->x();
  163.         QRect lineRect(horizontalMargin + r.x(), r.y() + (r.height() - fm.height() + 1) / 2,
  164.                        r.width() - 2 * horizontalMargin, fm.height());
  165.         QPainter painter(this);
  166.         painter.setPen(palette().brush(QPalette::Disabled, QPalette::Text).color());
  167.         painter.drawText(lineRect, Qt::AlignLeft|Qt::AlignVCenter, m_inactiveText);
  168.     } else {
  169.         ExLineEdit::paintEvent(event);
  170.     }
  171. }
  172. void SearchLineEdit::resizeEvent(QResizeEvent *event)
  173. {
  174.     updateGeometries();
  175.     ExLineEdit::resizeEvent(event);
  176. }
  177. void SearchLineEdit::updateGeometries()
  178. {
  179.     int menuHeight = height();
  180.     int menuWidth = menuHeight + 1;
  181.     if (!m_searchButton->m_menu)
  182.         menuWidth = (menuHeight / 5) * 4;
  183.     m_searchButton->resize(QSize(menuWidth, menuHeight));
  184. }
  185. QString SearchLineEdit::inactiveText() const
  186. {
  187.     return m_inactiveText;
  188. }
  189. void SearchLineEdit::setInactiveText(const QString &text)
  190. {
  191.     m_inactiveText = text;
  192. }
  193. void SearchLineEdit::setMenu(QMenu *menu)
  194. {
  195.     if (m_searchButton->m_menu)
  196.         m_searchButton->m_menu->deleteLater();
  197.     m_searchButton->m_menu = menu;
  198.     updateGeometries();
  199. }
  200. QMenu *SearchLineEdit::menu() const
  201. {
  202.     if (!m_searchButton->m_menu) {
  203.         m_searchButton->m_menu = new QMenu(m_searchButton);
  204.         if (isVisible())
  205.             (const_cast<SearchLineEdit*>(this))->updateGeometries();
  206.     }
  207.     return m_searchButton->m_menu;
  208. }