如何在QLineEdit上放置图标?

时间:2015-01-15 07:13:00

标签: qt layout pyqt pyqt4 qlineedit

在stackoverflow.com网站的右上角有一个带有放大镜头和灰色“搜索”关键字的搜索字段:

enter image description here

我想知道是否可以使用QLineEdit实现相同的外观。如果是,那怎么样?

7 个答案:

答案 0 :(得分:13)

傻瓜的简单方法

  1. 添加QLineEdit,并按QLineEdit::setFrame
  2. 设置无框架
  3. 添加一个QLabel,背景色为白色(样式表)和图标
  4. 将线条编辑和标签与布局相结合,将间距设置为0
  5. 使用QLineEdit::setPlaceholderText
  6. 设置占位符文字

    结果

    enter image description here


    高级方式

    检查此主题:"Can QLineEdit do this?"

    相关的python代码:http://bazaar.launchpad.net/~henning-schroeder/%2Bjunk/qtwidgets/annotate/head:/qtwidgets/lineedit.py

    或者

    "How to do - inside in QLineEdit insert the button.[pyqt4]"

    基本上通过在其上绘制小部件(标签,按钮甚至组合框)来定制QLineEdit。然后重置边距,光标,填充和绘制事件。没有魔法!

答案 1 :(得分:13)

这是另一种简单的方法:

placeholderText设置为“”并将字体系列设置为Seqoe UI Symbol或其他可在目标系统上找到的包含U + 1F50D LEFT-POINTING MAGNIFYING GLASS字形的字体。

demo of result

答案 2 :(得分:8)

以下是仅使用样式表实现此目的的方法:

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

它仍然不完美。你对图标的位置影响不大。

答案 3 :(得分:7)

得到这样的结果:
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);
    }
}

修改:可能的解决方案是使用custom plugin直接在QtDesigner中使用它。

答案 4 :(得分:7)

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/

答案 5 :(得分:2)

QT5 addAction

```

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

```

答案 6 :(得分:0)

从QT 5.2起,您可以执行以下操作。如果要使其更加灵活,应使用指针:


QIcon *ico;
ico = new QIcon(":/images/search.ico");
searchEdit->addAction(*ico, QLineEdit::LeadingPosition);