Как разместить значок на QLineEdit?

есть поле поиска с увеличительным объективом и серым ключевым словом" поиск " в правом верхнем углу stackoverflow.com веб-сайт:

enter image description here

интересно, можно ли добиться такого же внешнего вида с помощью QLineEdit. Если да то как?

6 ответов


простой способ для чайников

  1. добавить QLineEdit, и установите его безрамным QLineEdit::setFrame
  2. добавить QLabel С цветом фона в Белом (по таблице стилей) и значком
  3. объедините редактирование строки и метку с макетом, установите интервал в 0
  4. установить текст заполнителя с QLineEdit::setPlaceholderText

результат

enter image description here


Функции

проверьте эту тему:"может QLineEdit сделать это?"

и соответствующий код python: http://bazaar.launchpad.net/~henning-schroeder/%2Bjunk/qtwidgets/annotate/head:/qtwidgets/lineedit.py

или

" как сделать-внутри в QLineEdit вставьте кнопку.[в составе PyQt4]"

в основном подгонял QLineEdit путем рисования виджета (метки, кнопки или даже combobox) на нем. Затем сбросьте поле, курсор, отступ и события Paint. Никакой магии!


вот альтернативный простой способ:

установить placeholderText В "" и семейство шрифтов в Seqoe UI Symbol или другой шрифт,который можно найти в ваших целевых системах, которые включают глиф увеличительного стекла U+1F50D слева.

demo of result


вот способ достичь этого только с таблицами стилей:

QLineEdit {
    background: #f3f3f3;
    background-image: url(:Images/search.svg); /* actual size, e.g. 16x16 */
    background-repeat: no-repeat;
    background-position: left;
    color: #252424;
    font-family: SegoeUI;
    font-size: 12px;
    padding: 2 2 2 20; /* left padding (last number) must be more than the icon's width */
}

вот результат:

A QLineEdit search field

Это все еще не идеально. Вы не имеете большого влияния на положение иконы.


чтобы получить такой результат:
Qt icon QLineEdit

вы можете подкласс QLineEdit.
Поэтому ваш заголовок должен выглядеть так:

#ifndef LINEEDITICON_H
#define LINEEDITICON_H

#include <QLineEdit>
#include <QIcon>

class LineEditIcon : public QLineEdit
{
    Q_OBJECT

public:
    LineEditIcon(const QIcon icon, QWidget *parent = Q_NULLPTR);
    ~LineEditIcon();
    void setIcon(QIcon icon);    
protected:
    virtual void paintEvent(QPaintEvent *event);    
private:
    QIcon m_icon;       
};

#endif // LINEEDITICON_H

и ваш исходный файл выглядит так:

#include "lineediticon.h"
#include <QPainter>

LineEditIcon::LineEditIcon(const QIcon icon, QWidget *parent)
    : QLineEdit(parent)
{
    setIcon(icon);
}

LineEditIcon::~LineEditIcon()
{    
}

void LineEditIcon::setIcon(QIcon icon)
{
    m_icon = icon;
    if (m_icon.isNull())
        setTextMargins(1, 1, 1, 1);
    else
        setTextMargins(20, 1, 1, 1);
}

void LineEditIcon::paintEvent(QPaintEvent * event)
{
    QLineEdit::paintEvent(event);
    if (!m_icon.isNull()) {
        QPainter painter(this);
        QPixmap pxm = m_icon.pixmap(height() - 6, height() - 6);
        int x = 2, cx = pxm.width();

        painter.drawPixmap(x, 3, pxm);
        painter.setPen(QColor("lightgrey"));
        painter.drawLine(cx + 2, 3, cx + 2, height() - 4);
    }
}

редактировать: возможным решением является использование пользовательский плагин использовать его непосредственно в QtDesigner.


QLineEdit* _lineEdit = new QLineEdit();
_lineEdit->setClearButtonEnabled(true);
_lineEdit->addAction(":/resources/search.ico", QLineEdit::LeadingPosition);
_lineEdit->setPlaceHolderText("Search...");

извлечено из:http://saurabhg.com/programming/search-box-using-qlineedit/


QT5 addAction

``

const QIcon passwordIcon(":/new/icons/res/passwd.png");
ui->password->setClearButtonEnabled(true);
ui->password->addAction(passwordIcon, QLineEdit::LeadingPosition);

``