2014-10-22 5 views
1

Я хочу иметь QLineEdit с конкретным текстовым форматом заполнителя: он должен иметь выровненный и выровненный по центру текст. Вот пример:Пользовательский заполнитель в QLineEdit

example

Любые идеи?

+0

НЕ СВЯЗЬ информацию, важную для ваших вопросов. В какой-то день ссылка будет ломаться в любом случае, показывая поток бесполезно. Вставьте изображение! – Silicomancer

+1

@ Силикономер: это невозможно с текущим уровнем репутации ... Я исправил это для OP, своего рода. – lpapp

+0

@ lpapp спасибо! – Deutsche

ответ

5

К сожалению, в this seems to be all hard codedvoid QLineEdit::paintEvent(QPaintEvent *) следующим образом:

if (d->shouldShowPlaceholderText()) { 
    if (!d->placeholderText.isEmpty()) { 
     QColor col = pal.text().color(); 
     col.setAlpha(128); 
     QPen oldpen = p.pen(); 
     p.setPen(col); 
     QRect ph = lineRect.adjusted(minLB, 0, 0, 0); 
     QString elidedText = fm.elidedText(d->placeholderText, Qt::ElideRight, ph.width()); 
     p.drawText(ph, va, elidedText); 
     p.setPen(oldpen); 
    }  
} 

Вы можете переопределить это самостоятельно в подклассе, если вы хотите.

Естественно, вы могли бы также «обманывать» пространство и размеры шрифта, но для этого потребовалось бы немного больше работы, и в конце концов это было бы более неприятно, не говоря уже о долговременной надежности.

Вы также можете внести свой вклад в проект Qt, чтобы сделать этот класс более гибким, но они могут отклонить его из-за недостаточного общего случая. Это зависит от сопровождающего (-ов).

+0

Спасибо! Это помогло. Я создал код из этих источников. – Deutsche

+0

@Deutsche: тогда выберите ответ. Кстати, почему вы вызываете метод baseclass? – lpapp

+0

, потому что прежде всего QLineEdit нужно покрасить (фон, граница), а затем этот пользовательский заполнитель нарисован над изображением QLineEdit. – Deutsche

1

Я не знаю, как это сделать. Вы можете попытаться вычислить ширину пикселя (используя QFontMetrics) обеих частей-заполнителей и вычислить количество пробелов, которые вам нужно вставить между частями-заполнителями, чтобы они отображались в выровненных. Вам необходимо установить/обновить вычисленный заполнитель всякий раз, когда изменяется размер виджета.

2

Спасибо, @lpapp! Его советы верны. Вот код, который я создал от the Qt sources, предложенный @lpapp:

void LineEdit::paintEvent(QPaintEvent *e) { 
    QLineEdit::paintEvent(e); 
    if (!text().isEmpty()) { 
     return; 
    } 
    QPainter p(this); 

    QStyleOptionFrameV2 panel; 
    initStyleOption(&panel); 
    QRect r = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this); 
    r.setX(r.x() + textMargins().left()); 
    r.setY(r.y() + textMargins().top()); 
    r.setRight(r.right() - textMargins().right()); 
    r.setBottom(r.bottom() - textMargins().bottom()); 

    QFontMetrics fm = fontMetrics(); 
    int minLB = qMax(0, -fm.minLeftBearing()); 
    int minRB = qMax(0, -fm.minRightBearing()); 
    int vscroll = r.y() + (r.height() - fm.height() + 1)/2; 
    static const int horizontalMargin = 2; // QLineEditPrivate::horizontalMargin 
    QRect lineRect(r.x() + horizontalMargin, vscroll, r.width() - 2*horizontalMargin, fm.height()); 
    QRect ph = lineRect.adjusted(minLB, 0, -minRB, 0); 

    QColor col = palette().text().color(); 
    col.setAlpha(128); 
    p.setPen(col); 

    QString left = fm.elidedText("left", Qt::ElideRight, ph.width()); 
    Qt::Alignment leftAlignment = QStyle::visualAlignment(Qt::LeftToRight, QFlag(Qt::AlignLeft)); 
    p.drawText(ph, leftAlignment, left); 

    QString right = fm.elidedText("right", Qt::ElideRight, ph.width()); 
    Qt::Alignment rightAlignment = QStyle::visualAlignment(Qt::LeftToRight, QFlag(Qt::AlignRight)); 
    p.drawText(ph, rightAlignment, right); 
} 
Смежные вопросы