2012-02-07 11 views
11

私が作っているプロットの軸ラベルが必要です。もちろん、y軸ラベルは垂直方向に向けるべきです。私はかなり確信していますQwtPlotこれを行いますが、私は物事を明るく保つために私はちょうど単純なものを使用しています。QWidget + QPainter今のところです。ドキュメントでQLabelの方向を変更する方法がありませんでした。いくつかの解決策はthis 2002 threadで与えられていますが、私はそのようなハックのように見えないものが欲しいです。私は今Qt 4.8を使用していますが、実際にQPainter::drawText()以外でこれを行う方法はありませんか?縦型QLabelまたはそれに相当する?

答えて

9

だから確かに、私は確かに彼はQwtScaleDraw::labelTransformationで、回転を達成するために彼のQwtPainter::drawTextラッパー関数でQPainter::drawText()を使用し、QTransformこれを達成するための任意の簡単な方法を見つけること、そしてウーヴェRathmannのQWTコードを経由探しをあきらめました。だから私はちょうどこれらを一緒に入れました:

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

QLabelに便利な機能はありません。したがって:

  1. QGraphicsViewを使用すると、必要に応じてアイテムを変換できます。

  2. QPainterを使用してください。おそらく、最も簡単な方法は、テキストをQPixmapに描画し、QLabelに設定することです。

+0

QPixmapに回転されたテキストを描画する方法を詳しく説明できますか? QPixmap :: drawText()関数は何も表示されません。 –

+0

QPainmapを使用するすべてのQPaintDevicesに描画するには、QPainterを使用します。 –

1

新しいQGraphicsSceneを作成し、QLabelを追加して回転させることもできます。このように:

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

は( direct URLを見て、間違った比率を有する出力画像) similar exampleを見てみましょう。これを使用して

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

'painter.rotate(270)'の呼び出しの前に270回転する場合は、 'painter.translate(sizeHint()。width()、sizeHint()。height())'を呼び出します。 – metal

+3

Qt初心者(私のような)について:QtクリエイターのこのVerticalLabelのプレースホルダーとして通常のラベルを使用し、カスタムタイプに昇格させるだけです。こちらをご覧ください:http://doc.qt.io/qt-5/designer-using-custom-widgets.html – eresonance

2

はムスタファの実装の変種です。

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を除去しており、私の代わりに点のRECTを利用のDrawTextのオーバーロードを使用しています。これにより、テキストの中に '\ n'を置くか、WordWrapをフラグとして使用することができます。

関連する問題