2012-02-07 17 views
11

Quiero etiquetas de eje para un trazado que estoy haciendo, y naturalmente la etiqueta del eje y debe orientarse verticalmente. Estoy bastante seguro de que QwtPlot hace esto, pero estoy tratando de mantener las cosas claras así que solo estoy usando un simple QWidget + QPainter por el momento. No vi ninguna forma de cambiar la orientación QLabel en la documentación. Algunas soluciones se dan en this 2002 thread pero me gustaría algo que no parezca un hack. Estoy usando Qt 4.8 ahora, ¿realmente no hay manera de hacer esto aparte de QPainter::drawText()?QLabel vertical, o el equivalente?

Respuesta

9

Así que de hecho me di por vencido en la búsqueda de cualquier manera sencilla de lograr esto, y mirando por encima de código Qwt de Uwe Rathmann de hecho se utiliza QPainter::drawText() en su función de contenedor QwtPainter::drawText, y una QTransform para lograr la rotación, en QwtScaleDraw::labelTransformation. Así que acabo de poner todo junto de la siguiente manera:

void LabelWidget::paintEvent(QPaintEvent*) 
{ 
    QPainter painter(this); 
    painter.setPen(Qt::black); 
    //... Need an appropriate call to painter.translate() for this to work properly 
    painter.rotate(90); 
    painter.drawText(QPoint(0,0), _text); 
} 

No fue necesario un QPixmap, resulta.

2

No hay una función útil en QLabel para hacer lo que quiera, no. Entonces:

  1. Use QGraphicsView, que le permite transformar los elementos como lo desee.

  2. Use QPainter. Probablemente, el enfoque más fácil sea dibujar el texto girado en un QPixmap, luego configúrelo en su QLabel.

+0

¿Podría explicar cómo dibujar el texto rotado en un QPixmap? No veo ningún tipo de función 'QPixmap :: drawText()'. –

+0

Utiliza un QPainter para dibujar a todos los QPaintDevices, de los cuales QPixmap es uno. –

1

También puede crear una nueva QGraphicsScene, agregarla QLabel y luego girarla. De esta manera:

QLabel* label = QLabel("Y axis"); 
QGraphicsScene scene; 
QGraphicsProxyWidget * proxy = scene.addWidget(label); 
proxy->rotate(-45); 
QGraphicsView view(&scene); 
view.show(); 

Tome una mirada al similar example al (imagen de salida tiene una relación equivocada, mira el direct URL).

20

tratar de usar esto:

#ifndef VERTICALLABEL_H 
#define VERTICALLABEL_H 

#include <QLabel> 

class VerticalLabel : public QLabel 
{ 
    Q_OBJECT 

public: 
    explicit VerticalLabel(QWidget *parent=0); 
    explicit VerticalLabel(const QString &text, QWidget *parent=0); 

protected: 
    void paintEvent(QPaintEvent*); 
    QSize sizeHint() const ; 
    QSize minimumSizeHint() const; 
}; 

#endif // VERTICALLABEL_H 

/// CPP

#include "verticallabel.h" 

#include <QPainter> 

VerticalLabel::VerticalLabel(QWidget *parent) 
    : QLabel(parent) 
{ 

} 

VerticalLabel::VerticalLabel(const QString &text, QWidget *parent) 
: QLabel(text, parent) 
{ 
} 

void VerticalLabel::paintEvent(QPaintEvent*) 
{ 
    QPainter painter(this); 
    painter.setPen(Qt::black); 
    painter.setBrush(Qt::Dense1Pattern); 

    painter.rotate(90); 

    painter.drawText(0,0, text()); 
} 

QSize VerticalLabel::minimumSizeHint() const 
{ 
    QSize s = QLabel::minimumSizeHint(); 
    return QSize(s.height(), s.width()); 
} 

QSize VerticalLabel::sizeHint() const 
{ 
    QSize s = QLabel::sizeHint(); 
    return QSize(s.height(), s.width()); 
} 
+2

Si desea rotar en 270, antes de la llamada a 'pintor.rotar (270)', llame a 'pintor.translate (sizeHint(). Width(), sizeHint(). Height())'. – metal

+3

Para aquellos novatos de Qt (como yo): puede usar una etiqueta normal como marcador de posición para este creador de VerticalLabel in Qt, y simplemente promocionarlo a su tipo personalizado. Vea aquí: http://doc.qt.io/qt-5/designer-using-custom-widgets.html – eresonance

2

Aquí es una variante de ejecución de Mostafa.

void VerticalLabel::paintEvent(QPaintEvent*) 
{ 
    QPainter painter(this); 

// painter.translate(sizeHint().width(),0); 
// painter.rotate(90); 
    painter.translate(0,sizeHint().height()); 
    painter.rotate(270); 

    painter.drawText(QRect (QPoint(0,0),QLabel::sizeHint()),Qt::AlignCenter,text()); 
} 

básicamente i han eliminado setPen y setBrush para preservar hoja de estilo y he utilizado una sobrecarga de drawText que utiliza el rect en lugar de punto. Esto permite tener la '\ n' dentro del texto o usar WordWrap como indicador.