2012-02-07 14 views
11

मैं एक प्लॉट के लिए धुरी लेबल चाहता हूं जो मैं बना रहा हूं, और स्वाभाविक रूप से वाई-अक्ष लेबल लंबवत उन्मुख होना चाहिए। मुझे यकीन है कि QwtPlot ऐसा करता है, लेकिन मैं चीजों को प्रकाश रखने की कोशिश कर रहा हूं इसलिए मैं अभी एक साधारण QWidget + QPainter का उपयोग कर रहा हूं। मुझे प्रलेखन में QLabel अभिविन्यास बदलने का कोई तरीका नहीं मिला। कुछ समाधान this 2002 thread में दिए गए हैं, लेकिन मुझे ऐसा कुछ चाहिए जो ऐसा हैक जैसा प्रतीत नहीं होता है। मैं अब क्यूटी 4.8 का उपयोग कर रहा हूं, क्या QPainter::drawText() से इसे अलग करने का कोई तरीका नहीं है?वर्टिकल QLabel, या समकक्ष?

उत्तर

9

तो वास्तव में मैं इस लक्ष्य को हासिल करने के लिए किसी भी आसान तरीका खोजने और उवे RATHMANN के QWT कोड को देखने पर छोड़ दिया वास्तव में वह अपने QwtPainter::drawText आवरण समारोह में QPainter::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

QLabel में कोई भी आसान काम नहीं है जो आप चाहते हैं, नहीं। तो:

  1. उपयोग QGraphicsView, जो आप आइटम को मनचाहे ढंग को बदलने के लिए अनुमति देता है।

  2. QPainter का उपयोग करें। शायद सबसे आसान तरीका QPixmap में घुमाए गए पाठ को आकर्षित करना होगा, फिर इसे अपने QLabel पर सेट करें।

+0

क्या आप एक QPixmap में घुमाए गए पाठ को आकर्षित करने के बारे में विस्तृत जानकारी दे सकते हैं? मुझे किसी भी तरह का 'QPixmap :: drawText()' फ़ंक्शन नहीं दिख रहा है। –

+0

आप सभी QPaintDevices को आकर्षित करने के लिए QPainter का उपयोग करते हैं, जिनमें से QPixmap एक है। –

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 को देखो)।

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 

/// सीपीपी

#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() चौड़ाई(), आकार संकेत() ऊंचाई()) कॉल करें। – metal

+3

उन क्यूटी न्यूबीज (मेरे जैसे) के लिए: आप क्यूटी निर्माता में इस वर्टिकल लेबल के लिए प्लेसहोल्डर के रूप में एक सामान्य लेबल का उपयोग कर सकते हैं, और इसे अपने कस्टम प्रकार में प्रचारित कर सकते हैं। यहां देखें: 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 को हटा दिया है और मैं drawText की एक अधिभार बिंदु के बजाय रेक्ट का उपयोग करता है इस्तेमाल किया है। यह पाठ के अंदर '\ n' रखने या ध्वज के रूप में WordWrap का उपयोग करने की अनुमति देता है।

संबंधित मुद्दे