2014-07-10 2 views
0

Depuis quelque temps je cherche une méthode adéquate pour faire pivoter un QLabel - et le plus important pour garder ses fonctionnalités et ses feuilles de style.Rotation de QLabel et maintien de sa fonctionnalité/feuille de style

J'ai trouvé une approche assez intéressante ici: Vertical QLabel, or the equivalent?

D'abord, j'était satisfait car efficacement tourné l'étiquette. Malheureusement, la feuille de style que j'ai ajoutée (en utilisant une plus grande police et une autre couleur) a été complètement perdue et l'alignement a disparu aussi (myLabel_->setAlignment(Qt::AlignTop); n'a aucun effet).

J'ai lu QPainter::drawStaticText fournirait plus de fonctionnalités, mais pour moi, il ne fonctionne pas du tout (j'utilise le même code que dans la solution dont nous avons parlé, juste avec la différence:

QStaticText qs = "Test1"; 
painter.drawStaticText(0,0,qs); 

L'utilisation de HTML obsolète ("<b>...</b>") au lieu de feuilles de style est également inutile ... Identique au retour à un QLabel standard et à l'aide de feuilles de style de transformation modernes (http://snook.ca/archives/html_and_css/css-text-rotation).

Je suis à peu près à court d'idées maintenant que je suis en mesure de garder les anciennes propriétés du QLabel et encore pouvoir le faire tourner ...

Répondre

2

Il n'y a pas moyen facile de le faire.

QStylePainter peut aider avec le style:

#include<QStylePainter> 
// ...... 
void LabelWidget::paintEvent(QPaintEvent* event) { 
    QStylePainter painter(this); 
    painter.rotate(90); 
    painter.drawText(0, 0, text()); 
} 

Cela dessiner du texte avec des propriétés définies par la feuille de style, mais cela ne résout pas le problème d'alignement.


Si votre utilisation de code drawStaticTextrotate(90) et ne montre pas quelque chose, il est beacuse le texte tourne autour du point supérieur gauche et rotate(90) se déplacera le texte sur le widget (Essayez rotate(45), vous allez trouver une partie du texte est hors du widget). Une solution simple utilise QPainter::translate pour se déplacer vers le centre.

Voici mon code qui prennent en charge l'alignement:

#include<QStylePainter> 
// ...... 
void LabelWidget::paintEvent(QPaintEvent* event) { 
    QStylePainter painter(this); 

    // rotate at center 
    painter.translate(rect().center()); 
    painter.rotate(90); 
    painter.translate(-rect().center()); 

    painter.drawText(rect(), alignment(), text()); 
} 

Pour soutenir plus de fonctionnalités comme mot-emballage:

#include<QStylePainter> 
#include<QTextOption> 
// ...... 
void LabelWidget::paintEvent(QPaintEvent* event) { 
    QStylePainter painter(this); 

    // rotate at center 
    painter.translate(rect().center()); 
    painter.rotate(90); 
    painter.translate(-rect().center()); 

    QTextOption textOption; 
    textOption.setAlignment(alignment()); 
    if (wordWrap()) { 
     textOption.setWrapMode(QTextOption::WordWrap); 
    } else { 
     textOption.setWrapMode(QTextOption::NoWrap); 
    } 
    painter.drawText(rect(), text(), textOption); 
} 

Vous devrez ajouter plus de fonctionnalités si vous voulez d'autres propriétés du QLabel , il n'y a pas de solution simple. PS: Si vous souhaitez utiliser QStaticText, en faire une variable membre.

La classe QStaticText permet un dessin de texte optimisé lorsque le texte et sa mise en page sont rarement mis à jour.

QStaticText fournit un moyen de mettre en cache les données de mise en page pour un bloc de texte afin qu'il puisse être établi de manière plus efficace que l'aide QPainter :: drawText() dans lequel les informations de mise en page est recalculée à chaque appel.

+0

Nous vous remercions de votre solution! La partie avec la feuille de style a parfaitement fonctionné pour moi. Malheureusement, je ne peux toujours pas définir l'alignement (et je ne comprends pas pourquoi utiliser QStaticText - et où). En utilisant votre code, mon label a complètement disparu. Pourtant, je pourrais résoudre ce problème avec une autre idée. Je viens de déplacer mon Label dans un QGridLayout. Et au lieu d'utiliser 'myLabel _-> setAlignment (Qt :: AlignBottom);' J'ai utilisé 'mainLayout _-> addWidget (monLabel_, 1, 0, Qt :: AlignBottom);' - mainLayout_ est un QGridLayout. Résolu mon problème. – Qohelet

Questions connexes