2014-01-20 3 views
1

Мне нужно реализовать виджет LineEdit с возможностью добавления кнопок инструментов в правом конце области текста. Я знаю два способа сделать это, но оба решения кажутся уродливыми.QLineEdit с настраиваемой кнопкой

1) добавьте кнопки инструментов в виде дочерних виджетов QLineEdit и отредактируйте размер resizeEvent, чтобы правильно их расположить. Главный недостаток заключается в том, что если текст достаточно длинный, он может появляться под кнопками инструментов.

2) Еще одно решение - поместить редактирование строк и кнопки внутри рамки и перезаписать стиль, чтобы скрыть рамку с линией и сделать QFrame похожим на QLineEdit.

Мне нужен лучший способ реализовать такой виджет. Также мой виджет должен быть в стиле.

+0

Вы хотите добавить более одного QToolButton в вашем QLineEdit? –

+0

На данный момент я должен добавить только один, но в будущем это может быть два или более – ArmanHunanyan

+0

Я разместил мое решение ниже. Здесь используется ResizeEvent. Также вы можете настроить QLineEdit с помощью QSS, поэтому я думаю, что в качестве отправной точки этого будет достаточно. –

ответ

2

оригинальный блог уже нет, но Trolltech once posted an example of a clear button для Qt 4.

Результаты

Редактирование строки без текста:

Редактирование строки с текстом (появляется кнопка):

Line редактировать полный текст (не идет кнопка внизу):

Источник

lineedit.h

/**************************************************************************** 
** 
** Copyright (c) 2007 Trolltech ASA <[email protected]> 
** 
** Use, modification and distribution is allowed without limitation, 
** warranty, liability or support of any kind. 
**   
****************************************************************************/ 

#ifndef LINEEDIT_H 
#define LINEEDIT_H 

#include <QLineEdit> 

class QToolButton; 

class LineEdit : public QLineEdit 
{ 
    Q_OBJECT 

public: 
    LineEdit(QWidget *parent = 0); 

protected: 
    void resizeEvent(QResizeEvent *); 

private slots: 
    void updateCloseButton(const QString &text); 

private: 
    QToolButton *clearButton; 
}; 

#endif // LIENEDIT_H 

lineedit.cpp

/**************************************************************************** 
** 
** Copyright (c) 2007 Trolltech ASA <[email protected]> 
** 
** Use, modification and distribution is allowed without limitation, 
** warranty, liability or support of any kind. 
** 
****************************************************************************/ 

#include "lineedit.h" 
#include <QToolButton> 
#include <QStyle> 

LineEdit::LineEdit(QWidget *parent) 
    : QLineEdit(parent) 
{ 
    clearButton = new QToolButton(this); 
    QPixmap pixmap("fileclose.png"); 
    clearButton->setIcon(QIcon(pixmap)); 
    clearButton->setIconSize(pixmap.size()); 
    clearButton->setCursor(Qt::ArrowCursor); 
    clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); 
    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; } ").arg(clearButton->sizeHint().width() + frameWidth + 1)); 
    QSize msz = minimumSizeHint(); 
    setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), 
        qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2)); 
} 

void LineEdit::resizeEvent(QResizeEvent *) 
{ 
    QSize sz = clearButton->sizeHint(); 
    int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); 
    clearButton->move(rect().right() - frameWidth - sz.width(), 
         (rect().bottom() + 1 - sz.height())/2); 
} 

void LineEdit::updateCloseButton(const QString& text) 
{ 
    clearButton->setVisible(!text.isEmpty()); 
} 
+1

Какая польза от этих ответов «link-and-run»?! Ссылки целевой страницы все мертвы, и этот ответ стал бесполезным. Пожалуйста, не просто укажите ссылку; объясните это решение. Ссылки гниют. –

+0

@ ThePeacefulCoder Действительно. Вот почему ссылки только для ответов плохие.Я вытащил содержимое ссылки из машины с обратным доступом и добавил важные роли в сообщение. – cgmb

0

После того я реализовал такое решение для этого:

// LineEdit.h 

#ifndef LINEEDIT_H 
#define LINEEDIT_H 

#include <QLineEdit> 

class QToolButton; 

class LineEdit : public QLineEdit 
{ 
    Q_OBJECT 

public: 
    LineEdit(QWidget *parent = 0); 

protected: 
    void resizeEvent(QResizeEvent *); 

private: 
    QToolButton *furfurIcon; 
}; 

#endif // LINEEDIT_H 

// LineEdit.cpp 

#include "lineedit.h" 
#include <QToolButton> 
#include <QStyle> 

LineEdit::LineEdit(QWidget *parent) 
    : QLineEdit(parent) 
{ 
    furfurIcon = new QToolButton(this); 

    QPixmap pixmap(":/root/your_icon"); 
    furfurIcon->setIcon(QIcon(pixmap)); 
    furfurIcon->setIconSize(pixmap.size()); 
    furfurIcon->setCursor(Qt::ArrowCursor); 
    furfurIcon->setStyleSheet("QToolButton 
           "{" 
           "border: none; padding: 0px;" 
           "}"); 

    setStyleSheet(QString("QLineEdit" 
          "{" 
          "border: 1px solid;" 
          "border-color: rgb(148, 168, 199);" 
          "border-radius: 10px;" 
          "background: white;" 
          "padding-left: %1px;" 
          "}").arg(furfurIcon->sizeHint().width() - 4)); 

    setMinimumSize(0, 25); 
} 

void LineEdit::resizeEvent(QResizeEvent *) 
{ 
    QSize sz = furfurIcon->sizeHint(); 
    furfurIcon->move(rect().left(), (rect().bottom() + 1 - sz.height())/2); 
} 

Положение QToolButton обрабатывается в resizeEvent. Если их больше одного, вам нужно будет скорректировать их координаты. Также вы можете изменить его, чтобы использовать макет. Здесь нет перекрытия текста.

15

Начиная с Qt 5.2 можно использовать QLineEdit::addAction(...) для вставки пользовательских кнопок. (Qt Docs)

Пример (предположим, что мы находимся внутри определения MyClass):

QLineEdit *myLineEdit = new QLineEdit(this); 
QAction *myAction = myLineEdit->addAction(QIcon("test.png"), QLineEdit::TrailingPosition); 
connect(myAction, &QAction::triggered, this, &MyClass::onActionTriggered); 

enter image description here

+3

* Это *. Также есть удобство для кнопки очистки ('setClearButtonEnabled'). – peppe

+0

это классное решение, но для Qt4 мой ответ - только выбор. –

Смежные вопросы