我想要我正在制作的绘图的轴标签,自然地,y轴标签应该垂直定向。我很确定QwtPlot
会这样做,但我正在尝试保持清晰,所以我现在只使用一个简单的QWidget
+ QPainter
。我没有看到在文档中更改QLabel
方向的任何方法。 this 2002 thread给出了一些解决方案,但我想要的东西看起来不像是一个黑客。我现在正在使用Qt 4.8,除QPainter::drawText()
之外真的没有办法做到这一点吗?
答案 0 :(得分:20)
尝试使用:
#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());
}
答案 1 :(得分:9)
所以我确实放弃了找到任何简单的方法来实现这一点,并查看Uwe Rathmann的Qwt代码确实在他的QPainter::drawText()
包装函数中使用QwtPainter::drawText
,并使用QTransform
来在QwtScaleDraw::labelTransformation
中实现轮换。所以我把这些放在一起如下:
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);
}
事实证明,不需要QPixmap。
答案 2 :(得分:2)
QLabel
中没有方便的功能来做你想做的事,不。所以:
使用QGraphicsView
,您可以根据需要转换项目。
使用QPainter
。可能最简单的方法是将文本旋转为QPixmap
,然后将其设置在QLabel
上。
答案 3 :(得分:2)
以下是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());
}
基本上我已经删除了setPen和setBrush以保留样式表,并且我使用了drawText的重载,它使用rect而不是point。这允许在文本中包含'\ n'或使用WordWrap作为标志。
答案 4 :(得分:1)
你也可以创建一个新的QGraphicsScene
,添加QLabel,然后旋转它。像这样:
QLabel* label = QLabel("Y axis");
QGraphicsScene scene;
QGraphicsProxyWidget * proxy = scene.addWidget(label);
proxy->rotate(-45);
QGraphicsView view(&scene);
view.show();
查看similar example(输出图片的比率错误,请查看direct URL)。