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
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.
No hay una función útil en QLabel
para hacer lo que quiera, no. Entonces:
Use
QGraphicsView
, que le permite transformar los elementos como lo desee.Use
QPainter
. Probablemente, el enfoque más fácil sea dibujar el texto girado en unQPixmap
, luego configúrelo en suQLabel
.
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).
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());
}
Si desea rotar en 270, antes de la llamada a 'pintor.rotar (270)', llame a 'pintor.translate (sizeHint(). Width(), sizeHint(). Height())'. – metal
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
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.
- 1. qlabel centrando
- 2. Transparente QLabel
- 3. QLabel word wrap mode
- 4. QLabel auto multiple lines
- 5. ¿Cómo se habilita el suavizado en Qlabel?
- 6. Barra de desplazamiento vertical UL o DIV
- 7. ¿Por qué no funciona el pixmap de una QLabel?
- 8. Mostrando una animación .gif en QLabel
- 9. QLabel incrustado en QStatusBar utilizando Qt Designer
- 10. Scala ListBuffer (o equivalente) shuffle
- 11. ¿Macro o equivalente en reStructuredText?
- 12. NSTask o equivalente para iPhone
- 13. SQLAlchemy - INSERT O REPLACE equivalente
- 14. Heredar std :: istream o equivalente
- 15. Espaciado vertical iTextSharp
- 16. ¿Unicode o HTML tienen un doble guillemet vertical (chevron)?
- 17. ¿Es la barra vertical (|) CSS válido o específico de Firefox?
- 18. FxCop (o equivalente) para el código no-NET C++
- 19. Squeak Smalltalk flecha vertical en el código
- 20. PHP equivalente de amigo o interno
- 21. ¿Hay un 'git sed' o equivalente?
- 22. Equivalente de select o poll en bash
- 23. CouchDB - .NET o Mono Tecnología equivalente
- 24. ostream equivalente de% .2f o% .2lf
- 25. Diferentes alturas en Android GridView o equivalente
- 26. .htaccess o .htpasswd equivalente en IIS?
- 27. equivalente pitónico de unshift o rehacer?
- 28. Optimizar una consulta o sugerir LINQ equivalente
- 29. UITextField Alineación vertical
- 30. equivalente a push() o pop() para matrices?
¿Podría explicar cómo dibujar el texto rotado en un QPixmap? No veo ningún tipo de función 'QPixmap :: drawText()'. –
Utiliza un QPainter para dibujar a todos los QPaintDevices, de los cuales QPixmap es uno. –