2011-06-28 16 views
6

मैं (यहाँ शामिल है इंजन नहीं प्रस्तुत करना exept शुद्ध क्यूटी एक ...) एक QPixmap में सीधे drawRoundedRect विधि के साथ एक दौर आयत बनाने के लिए प्रयास करते हैं, मैं दोगुना मेरी पिक्समैप के आकार की तुलना में आयत के आकार की जांच:क्यूटी दौर आयत, क्यों कोनों अलग हैं?

Pixmap : QSize(50, 73) 
Rectangle: QRect(0,0 48x11) 

पर्याप्त जगह देखें ...

संपादित करें: कुछ कोड

pixmap = QPixmap(50,73); //example size that match my case 
QRectF rect(0,0,48,11); 

QPainter painter(&pixmap); 
painter.setRenderHint(QPainter::TextAntialiasing); 
painter.setWorldMatrixEnabled(false); 
painter.setPen(QPen()); //no pen 
painter.setBrush(QBrush(color)); 
painter.drawRoundedRect(rect, 2.0, 2.0); 
  • मैं विकलांग दुनिया परिवर्तन ...
  • मैं एकता के लिए परिवर्तन सेट सेट ...
  • मैं कई त्रिज्या (1.0,2.0,3.0,4.0) की कोशिश की ...
  • मैं कलम चौड़ाई, ब्रश रंग बदलने ...

लेकिन यह हमेशा 4 अलग कोनों के साथ एक rectamgle के साथ समाप्त होता है! कि जैसा:

Radius = 3.0 in x and y

मैं सीधे ouptut एक फाइल करने के लिए पिक्समैप यकीन है कि मैं प्रदर्शन ... एक ही आकार के दौरान यह स्क्रैप नहीं किया गया हो।

कोई भी छोटे त्रिज्या के साथ क्यूटी दौर आयताकार के बारे में जानता है? मैंने बहुत समय पहले इसके बारे में कुछ देखा लेकिन मुझे याद नहीं है कि इससे कैसे निपटें!

उत्तर

14

ऐसा लगता है कि आप एंटी-एलियासिंग का उपयोग नहीं कर रहे हैं (यानी QPainter::Antialiasing संकेत प्रस्तुत करें)। यह एक क्यूटी क्विर्क है जो इसके बिना होता है। जो मैंने देखा/सुना है, उससे क्यूटी देव इसे ठीक करने के लिए बहुत चिंतित नहीं हैं (ज्यादातर लोग वैसे भी एंटी-एलियासिंग चाहते हैं)।

कार्य-आसपास (केवल एंटी-एलाइजिंग का उपयोग करने के अलावा) QPainter::drawLine() और QPainter::drawArc() के साथ खुद को आकर्षित करना है। आपको संख्याओं के साथ खेलना पड़ सकता है जब तक कि यह सही न लगे - सीधे गणना पिक्सल या दो बंद हो जाती है। साथ ही, आप पाते हैं कि इस विधि के साथ भी निचले दाएं कोने कभी भी बिल्कुल अन्य कोनों के समान नहीं है।

यदि आप हल्के महत्वाकांक्षी महसूस कर रहे हैं, तो आप इसे ठीक करने और क्यूटी को पैच सबमिट करने का प्रयास कर सकते हैं।

अद्यतन: आर्क ड्राइंग परिणाम Qt 5 में बदल गए। मेरे अनुभव में, यह एक बड़ा सुधार है।

+2

मैंने सामान खींचने के लिए अन्य तरीकों को एंटीअलाइजिंग के साथ खेला (ड्रवा पथ, आर्क ...)। इस तरह की छोटी चीजों के साथ Antialiasing इसे लायक बनाओ! और मेरा सबसे अच्छा शॉट ~ 0.5 हर जगह जोड़ रहा था जहां कताई अजीब व्यवहार पैदा कर सकती है ... तो मैं संख्या ** विधि के साथ ** खेल स्वीकार करूंगा! – vrince

+2

एक ही समस्या थी। 'QPainter पी (यह) का उपयोग करना; p.setRenderHint (QPainter :: एंटीएलियासिंग); पी.सेट रेन्डरहिंट (क्यूपेन्टर :: हाईक्यूविटीएन्टियालाइजिंग); 'मेरे लिए चाल थी। –

+0

बदलते पेन चौड़ाई जादू करता है !! – Ashish

0

रेंडर संकेतों के साथ खेलने का प्रयास करें 1) एंटीअलीज़िंग अक्षम करें; 2) SmoothPixmapTransform

सक्षम करें लेकिन फिर भी कोई गारंटी नहीं है कि इससे मदद मिलेगी।

+0

सही कहा, कोई गारंटी नहीं !! – Ashish

3

कोशिश जोड़ने आधा पिक्सेल ऑफसेट (उदा .: rect.translated(0.5,0.5)):

QRectF rect(0,0,48,11); 
painter.setRenderHint(QPainter::Antialiasing,false); 
painter.drawRoundedRect(rect.translated(0.5,0.5), 2.0, 2.0); 

मैं इस दो पिक्सेल के बीच एक पूर्णांक मूल्य रखने समन्वय प्रणाली के साथ क्या करना है लगता है।

यदि आप एंटीअलाइजिंग के साथ आकर्षित करते हैं और 1 पिक्सेल चौड़ाई की कलम का उपयोग करते हैं तो सटीक पूर्णांक समन्वय पर ड्राइंग के बजाय 2 पिक्सेल चौड़ाई के परिणामस्वरूप परिणाम होते हैं। केवल इस 0.5 पिक्सेल ऑफ़सेट के साथ आपको लाइनें मिलेंगी जो बिल्कुल 1 पिक्सेल चौड़ी हैं।

QRectF rect(0,0,48,11); 
painter.setRenderHint(QPainter::Antialiasing,true); 
painter.setBrush(Qt::NoBrush); 
painter.setPen(Qt::white); 
painter.drawRoundedRect(rect.translated(0.5,0.5), 2.0,2.0); 
2

मैं जानता हूँ कि यह एक पुरानी समस्या है, लेकिन Qt5 उपयोगकर्ताओं QPainter पर setRenderHint(QPainter::Qt4CompatiblePainting); फोन करने के लिए समस्या को हल करने लगता है।

संपादित करें:

मैं सीमा रंग के साथ एक साथ एक आदर्श गोलाकार आयत पैदा करने के लिए एक समाधान मिल गया है और यह गोल उदाहरण के लिए QPushButton की सीमा के द्वारा प्रयोग किया आयतों के रूप में एक ही लग रहा है।

void MyButtonGroup::paintEvent(QPaintEvent * e) 
{ 
    int borderSize = 5; 
    QColor borderColor = Qt::red; 
    QColor backgroundColor = Qt::blue; 
    int borderRadius = 3; 

    QPen pen; 
    pen.setWidth(borderSize); 
    pen.setColor(borderColor); 

    QPainter painter(this); 
    painter.setRenderHint(QPainter::Antialiasing); 
    painter.setPen(pen); 

    QRectF rect(rect().x() + borderSize/2, 
       rect().y() + borderSize/2, 
       rect().width() - borderSize, 
       rect().height() - borderSize); 


    if(borderSize % 2 == 0) 
    { 
     painter.drawRoundedRect(rect, 
           borderSize, 
           borderSize); 
    } 
    else 
    { 
     painter.drawRoundedRect(rect.translated(0.5, 0.5), 
           borderRadius, 
           borderRadius); 
    } 

    QBrush brush(backgroundColor); 
    pen.setBrush(brush); 
    painter.setBrush(brush); 

    if(borderSize % 2 == 0) 
    { 
     painter.drawRoundedRect(rect, 
           borderRadius, 
           borderRadius); 
    } 
    else 
    { 
     painter.drawRoundedRect(rect.translated(0.5, 0.5), 
           borderRadius, 
           borderRadius); 
    } 

    QWidget::paintEvent(e); 
} 

क्योंकि मैंने पाया यह थोड़ा मुश्किल यह परिणाम प्राप्त करने मैं इस पोस्ट कर रहा हूँ:

enter image description here

1

सबसे अच्छा तरीका आकर्षित करते RoundRect है यह मैं paintEvent कैसे कार्यान्वित इस लक्ष्य को हासिल करने के लिए है पथ। http://developer.nokia.com/community/wiki/Qt_rounded_rect_widget

void fillRoundRect(QPainter& painter, QRect r, int radius) 
{ 
    painter.setRenderHint(QPainter::Antialiasing,true); 

    QPainterPath rounded_rect; 
    rounded_rect.addRoundRect(r, radius, radius); 
    painter.setClipPath(rounded_rect); 

    painter.fillPath(rounded_rect,painter.brush());  
    painter.drawPath(rounded_rect);  
} 
0

मैं यहाँ जवाब से सभी सुझावों की कोशिश की है लेकिन कुछ भी मेरे लिए काम करता है। लेकिन इन कोड स्निपेट्स के आधार पर मुझे निम्नलिखित समाधान मिल गए हैं:

डिफ़ॉल्ट रूप से सेट m_pPainter->setRenderHint(QPainter::Qt4CompatiblePainting, true) और केवल चौड़ाई वाले आयतों के लिए चौड़ाई% 2 == 0 इसे निष्क्रिय करें।

QRect rect = ConvertRectangle(rectangle); 

int nPenWidth = m_pPainter->pen().width(); 
if (nPenWidth % 2 == 0) 
    m_pPainter->setRenderHint(QPainter::Qt4CompatiblePainting, false); 

m_pPainter->drawRoundedRect(rect, dbRadiusX, dbRadiusY); 

if (nPenWidth % 2 == 0) 
    m_pPainter->setRenderHint(QPainter::Qt4CompatiblePainting, true); 
संबंधित मुद्दे