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