Вертикальный QLabel или эквивалент?

Мне нужны метки осей для графика, который я делаю, и, естественно, метка оси Y должна быть ориентирована вертикально. Я уверен, что QwtPlot делает это, но я стараюсь держать вещи светлыми, поэтому я просто использую простой QWidget + QPainter. Я не видел никакого способа изменить ориентацию QLabel в документации. Некоторые решения приведены в в этом потоке 2002 года, но мне бы хотелось, чтобы это было похоже на такой хак. Теперь я использую Qt 4.8, нет ли способа сделать это в стороне от QPainter::drawText()?

Ответ 1

И действительно, я отказался от поиска простого способа добиться этого и, глядя на код 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

попробуйте использовать это:

#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

///каст

#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());
}

Ответ 3

В QLabel нет удобной функции, чтобы делать то, что вы хотите, нет. Итак:

  • Используйте QGraphicsView, который позволяет вам преобразовывать объекты, но вы хотите.

  • Используйте QPainter. Вероятно, самым простым подходом было бы превращение текста в QPixmap, а затем установить его на QLabel.

Ответ 4

Вот вариант реализации 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 вместо точки. Это позволяет иметь "\n" внутри текста или использовать WordWrap в качестве флага.

Ответ 5

Вы также можете создать новый QGraphicsScene, добавить к нему QLabel и затем повернуть его. Вот так:

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

Взгляните на аналогичный пример (выходное изображение имеет неправильное отношение, посмотрите прямой URL).