Вертикальный QLabel или эквивалент? - PullRequest
11 голосов
/ 08 февраля 2012

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

Ответы [ 5 ]

20 голосов
/ 29 августа 2013

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

#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());
}
9 голосов
/ 11 февраля 2012

Так что, действительно, я разочаровался в поиске любого простого способа добиться этого, и, просматривая код 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 голосов
/ 03 января 2016

Вот вариант реализации Мостафы.

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

2 голосов
/ 08 февраля 2012

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

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

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

1 голос
/ 26 июля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...