2010-10-08 15 views
13

क्यूटी 4, QtCreatorQt4 विजेट के अंदर कैसे आकर्षित करें?

मैं विजेट के अंदर आकर्षित करने के लिए कोशिश कर रहा हूँ:

void Widget::on_pushButton_clicked() 
{ 
    QPainter painter; 

    painter.begin(ui->label); 

    QRectF rectangle(10.0, 20.0, 80.0, 60.0); 
    int startAngle = 30 * 16; 
    int spanAngle = 120 * 16; 
    painter.drawArc(rectangle, startAngle, spanAngle); 

    painter.end(); 
} 

लेकिन बटन कुछ भी नहीं होता है जब मैं दबाएँ।

यह सही तरीके से कैसे करें?

उत्तर

21

आपको paintEvent() ओवरराइड करने की आवश्यकता है और वहां अपनी पेंटिंग करें। आपको वास्तव में begin() और end() की आवश्यकता नहीं है।

QPainter painter(this); 

साथ चित्रकार घोषित निर्माता begin() संभाल लेंगे, और जब painter वस्तु क्षेत्र से बाहर चला जाता है और नष्ट हो जाता है end() बुलाया जाएगा।

आपको चित्रकला को ट्रिगर करने के लिए क्लिक ईवेंट की भी आवश्यकता नहीं होगी। जब भी विजेट को खुद को आकर्षित करने की आवश्यकता होती है तो paintEvent() कॉल किया जाएगा। आप एक बूलियन टॉगल करने के लिए बटन क्लिक कर सकते हैं कि paintEvent() यह निर्धारित करने के लिए जांच करता है कि यह आयताकार और चाप प्रदर्शित करना चाहिए या नहीं। चर को टॉगल करने के बाद बस सुनिश्चित करें कि आप update() पर कॉल करें।

void Widget::on_pushButton_clicked() 
{ 
    drawShapes = !drawShapes; 
    update(); 
} 

void Widget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 

    if(drawShapes) 
    { 
     QRectF rectangle(10.0, 20.0, 80.0, 60.0); 
     int startAngle = 30 * 16; 
     int spanAngle = 120 * 16; 
     painter.drawArc(rectangle, startAngle, spanAngle); 
    } 
} 

अद्यतन:

ओवरराइड करने के लिए एक विजेट के paintEvent(), आप एक QLabel उपयोग करें और यह करने के लिए एक पिक्समैप आवंटित और उस को पेंट कर सकते से बचने के लिए। नोट: जहां तक ​​मैं कह सकता हूं, आपको प्रत्येक बार इसे संशोधित करने पर पिक्समैप सेट करने की आवश्यकता होगी।

void MainForm::slot_buttonClick() 
{ 
    QPixmap pixmap(100,100); 
    pixmap.fill(QColor("transparent")); 

    QPainter painter(&pixmap); 
    painter.setBrush(QBrush(Qt::black)); 
    painter.drawRect(10, 10, 100, 100); 

    label.setPixmap(pixmap); 
} 
+0

क्या ओवरराइड किए बिना पेंट करने का कोई तरीका है? या क्या कोई ऐसा घटक है जिस पर मैं किसी भी घटना के बिना आकर्षित कर सकता हूं, जैसे टीआईमेज या टीएफओआर या वीसीएल (डेल्फी) में टीसीएनवास युक्त कोई अन्य घटक? (डेल्फी में केवल फॉर्म 1 लिख सकता है। कन्वस। सर्कल (...) जब भी मुझे इसकी ज़रूरत होती है, न केवल ऑनपेंट इवेंट के अंदर) – Astronavigator

+0

मैंने वास्तव में विजेट के बाहर कोड के साथ एक विजेट पर ड्राइंग करने की कोशिश नहीं की है, लेकिन क्यूविजेट पेंटडेविस का उत्तराधिकारी है यह संभव होना चाहिए। –

+0

स्क्रैच कि, QPainter के लिये दस्तावेज से .. "चेतावनी: जब paintdevice एक विजेट है, QPainter केवल एक paintEvent() फ़ंक्शन के अंदर या एक समारोह paintEvent() द्वारा कहा जाता है में इस्तेमाल किया जा सकता है, वह यह है कि जब तक क्यूटी :: WA_PaintOutsidePaintEvent विजेट विशेषता सेट है। मैक ओएस एक्स और विंडोज़ पर, आप केवल इस विशेषता की सेटिंग के बावजूद पेंटएवेंट() फ़ंक्शन में पेंट कर सकते हैं। " –

0

आप रंग-विधि के रूप में अर्नोल्ड स्पेंस द्वारा वर्णित के ऊपर लिख हैं, तो आप माता-पिता की paintEvent बुलाना चाहिए या आप एक विजेट है कि केवल एक सफेद पृष्ठभूमि पर अपने आयत से पता चलता अंत।

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