2016-04-25 22 views
4

Ich habe ein QLabel knapp unter einem QLineEdit mit gleicher Größe und Ausrichtung Eigenschaften:Align auf den rechten Seite Text von QLabel und 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); 

Hier ist, wie dies gemacht wird:

enter image description here

Wie kann ich den Text der unteren label genau auf den Text der lineEdit rechts ausgerichtet?

Voll Auszeichnung, wenn Sie eine Lösung finden, die auf allen Plattformen funktioniert, und das funktioniert auch, wenn die Schriftgrößen unterschiedlich sind in der lineEdit und label.

+0

Wie Sie sehen können, verwendet 'QLineEdit' ein Trennzeichen vom Rand zum Text (ganz wie der Rand von' QLayout'. Sie können ein Layout um das 'Label' hinzufügen, um dieses Verhalten zu emulieren. – Zaiborg

+2

Have a Siehe http://doc.qt.io/qt-4.8/qlabel.html#indent-prop – Ankur

+1

Wenn Sie eine genaue Auffüllung berechnen müssen, können Sie [QLineEdit :: textMargins()] (http: // doc .qt.io/qt-5/qlineedit.html # textMargins) – ymoreau

Antwort

6

Leider kann es nicht möglich sein, zumindest nicht aus der Box, der rechte Rand wird nicht funktionieren, wie es immer 0 ist, auch wenn der Text offensichtlich nach links versetzt ist. Der Grund dafür ist, dass dieser Offset nicht von den Margen bestimmt wird, sondern von der Kombination aus dem GUI-Stil der Plattform und den verwendeten Metriken der einzelnen Fonts abhängt und dass der Wert "praktisch" in der öffentlichen Klasse nicht verfügbar ist um dahin zu kommen.

Sie können die Schriftart-Metriken leicht erhalten, aber Sie können nicht QStyleOptionFrame als die erforderliche Methode ist geschützt, Zugriff darauf erfordert Unterklasse QLineEdit. Allerdings, wenn Sie Glück haben, ist dieser Wert sehr wahrscheinlich Null sein, so dass Sie mit etwas so Einfaches wie das gehen könnte:

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); 

Wenn das nicht richtig für Sie arbeiten, werden Sie keine andere Wahl haben Unterklasse QLineEdit, überprüfen Sie sorgfältig das Paint-Ereignis, ermitteln Sie, wo der Offset berechnet wird, und speichern Sie diesen Wert in einem öffentlichen Member, sodass von außen auf ihn zugegriffen werden kann, um die Beschriftung zu versetzen.

enter image description here

+0

Dies ist ein ziemlich einfacher Code! Da es nicht funktioniert, wenn die QTextEdit-Schriftgröße größer als in QLabel ist, habe ich die Frage unbeantwortet gelassen. – mimo

4

Würden Sie in der Lage sein, anstatt ein QLineEdit der Verwendung und ein QLabel zu verwenden, um zwei QLineEdits:

ich persönlich mit diesem Code Glück hat?

Beachten Sie Folgendes:

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(); 

Es zwingt alle Grenzen 2px zu sein, also auf verschiedenen Plattformen sollte es gleich sein. Die zweiten QLineEdit soll nicht anders aussehen als die QLabel (Die Textfarbe als die des Etiketts, wenn auch etwas dunkler aussieht, was eine gute Sache sein könnte, da es das Original bearbeiten matches)

den zusätzlichen Vorteil der Verwendung ein QLineEdit statt die QLabel ist, dass der Wert jetzt wählbar ist ...

Disclaimer: Ich habe nur unter Linux getestet und ich habe keinen Pixel-Level-Vergleich durchgeführt.

Edit: Ich sehe die Ausrichtung mit verschiedenen Schriftgrößen ausfällt.

Verwandte Themen