垂直QLabel,或等效?

时间:2012-02-07 20:03:13

标签: c++ qt

我想要我正在制作的绘图的轴标签,自然地,y轴标签应该垂直定向。我很确定QwtPlot会这样做,但我正在尝试保持清晰,所以我现在只使用一个简单的QWidget + QPainter。我没有看到在文档中更改QLabel方向的任何方法。 this 2002 thread给出了一些解决方案,但我想要的东西看起来不像是一个黑客。我现在正在使用Qt 4.8,除QPainter::drawText()之外真的没有办法做到这一点吗?

5 个答案:

答案 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中没有方便的功能来做你想做的事,不。所以:

  1. 使用QGraphicsView,您可以根据需要转换项目。

  2. 使用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)。