Выровняйте по тексту справа от QLabel и QLineEdit
У меня есть QLabel
чуть ниже QLineEdit
с одинаковыми размерами и свойствами выравнивания:
QLineEdit *lineEdit = new QLineEdit("999");
lineEdit->setFixedWidth(100);
lineEdit->setAlignment(Qt::AlignRight);
//
QLabel *label = new QLabel("999");
label->setFixedWidth(100);
label->setAlignment(Qt::AlignRight);
//
QLayout *layout = new QVBoxLayout;
layout->addWidget(lineEdit);
layout->addWidget(label);
Вот как это отображается:
Как я могу получить текст снизу label
точно по правому краю к тексту lineEdit
?
Полная награда, если вы найдете решение, которое работает на всех платформах, а также работает, когда размеры шрифтов в lineEdit
а также label
,
3 ответа
К сожалению, это может быть невозможно, по крайней мере, не из коробки, правое поле не будет работать, так как оно всегда равно 0, даже если текст явно смещен влево. Причина этого заключается в том, что это смещение не определяется полями, а зависит от комбинации стиля графического интерфейса платформы и используемых метрик конкретного шрифта, а его значение "удобно" недоступно в общедоступном интерфейсе класса. чтобы добраться до него.
Вы можете легко получить метрику шрифта, но вы не можете получить QStyleOptionFrame
поскольку требуемый метод защищен, доступ к нему потребует подкласса QLineEdit
, Однако, если вам повезет, это значение, скорее всего, будет равно нулю, поэтому вы можете пойти с чем-то простым:
QVBoxLayout *layout = new QVBoxLayout;
QLineEdit *lineEdit = new QLineEdit("999");
lineEdit->setAlignment(Qt::AlignRight);
QLabel *label = new QLabel("999");
label->setAlignment(Qt::AlignRight);
int offsetValue = lineEdit->fontMetrics().averageCharWidth();
label->setIndent(offsetValue);
setLayout(layout);
layout->addWidget(lineEdit);
layout->addWidget(label);
Если это не работает правильно для вас, у вас не будет другого выбора, кроме как подкласс QLineEdit
внимательно изучите событие рисования, определите, где рассчитывается смещение, и сохраните это значение в открытом члене, чтобы к нему можно было получить доступ извне, чтобы использовать его для смещения метки.
Мне лично повезло с этим кодом:
Вы могли бы вместо того, чтобы использовать QLineEdit
и QLabel
использовать два QLineEdits?
Учтите следующее:
QWidget* widget = new QWidget();
// Original line edit
QLineEdit *lineEdit1 = new QLineEdit("999");
lineEdit1->setFixedWidth(100);
lineEdit1->setAlignment(Qt::AlignRight);
lineEdit1->setStyleSheet("border-width: 2px;");
// A suggestion if you want a label
QLabel *label = new QLabel("999");
label->setFixedWidth(100);
label->setAlignment(Qt::AlignRight);
label->setStyleSheet("border: 2px solid rgba(255, 0, 0, 0%)");
// Alternatively if you can use another QLineEdit
QLineEdit *lineEdit2 = new QLineEdit("999");
lineEdit2->setFixedWidth(100);
lineEdit2->setAlignment(Qt::AlignRight);
lineEdit2->setReadOnly(true);
lineEdit2->setStyleSheet("background: rgba(0, 0, 0, 0%); "
"border-width: 2px; "
"border-style: solid; "
"border-color: rgba(0, 0, 0, 0%);");
// Bring it all together
QLayout *layout = new QVBoxLayout(widget);
layout->addWidget(lineEdit1);
layout->addWidget(label);
layout->addWidget(lineEdit2);
widget->show();
Это заставляет все границы быть 2px, поэтому на разных платформах он должен быть одинаковым. Второй QLineEdit
не должен выглядеть иначе, чем QLabel
(Хотя цвет текста выглядит немного темнее, чем на этикетке, что может быть хорошо, так как он соответствует оригинальному редактированию)
Дополнительное преимущество использования QLineEdit
вместо QLabel
является то, что значение теперь можно выбрать...
Отказ от ответственности: я тестировал только на Linux, и я не сделал сравнение на уровне пикселей.
Изменить: я вижу, выравнивание не удается с разными размерами шрифта.
просто вы можете использовать свойство отступа QLabel.
Свойство indent может принимать +/- значения. возможно, функция маржи может сделать свою работу.