Я хочу иметь QLineEdit
с конкретным текстовым форматом заполнителя: он должен иметь выровненный и выровненный по центру текст. Вот пример:Пользовательский заполнитель в QLineEdit
Любые идеи?
Я хочу иметь QLineEdit
с конкретным текстовым форматом заполнителя: он должен иметь выровненный и выровненный по центру текст. Вот пример:Пользовательский заполнитель в QLineEdit
Любые идеи?
К сожалению, в 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, чтобы сделать этот класс более гибким, но они могут отклонить его из-за недостаточного общего случая. Это зависит от сопровождающего (-ов).
Спасибо! Это помогло. Я создал код из этих источников. – Deutsche
@Deutsche: тогда выберите ответ. Кстати, почему вы вызываете метод baseclass? – lpapp
, потому что прежде всего QLineEdit нужно покрасить (фон, граница), а затем этот пользовательский заполнитель нарисован над изображением QLineEdit. – Deutsche
Я не знаю, как это сделать. Вы можете попытаться вычислить ширину пикселя (используя QFontMetrics) обеих частей-заполнителей и вычислить количество пробелов, которые вам нужно вставить между частями-заполнителями, чтобы они отображались в выровненных. Вам необходимо установить/обновить вычисленный заполнитель всякий раз, когда изменяется размер виджета.
Спасибо, @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);
}
НЕ СВЯЗЬ информацию, важную для ваших вопросов. В какой-то день ссылка будет ломаться в любом случае, показывая поток бесполезно. Вставьте изображение! – Silicomancer
@ Силикономер: это невозможно с текущим уровнем репутации ... Я исправил это для OP, своего рода. – lpapp
@ lpapp спасибо! – Deutsche