2012-12-20 19 views
5

पतला किए बिना क्यूटी रेखांकित पाठ मैं Qt4.8 के साथ रेखांकित ग्रंथों को आकर्षित करना चाहता हूं, लेकिन मैं फ़ॉन्ट के मूल आकार और दृश्यता को भी रखना चाहता हूं। वर्तमान में, रूपरेखा पाठ वर्णों को छिपाती है और उन्हें मूल की तुलना में "पतली" दिखाई देती है।फ़ॉन्ट

क्यूटी क्यूपेन के साथ पाठ वर्णों (और अन्य आकार) की रूपरेखा तैयार करता है। क्यूपेन एक चरित्र के वास्तविक किनारे पर और के किनारे रेखा के के अंदर (क्यूपेन संदर्भ में "स्टाइल में शामिल हों" देखें) के वास्तविक किनारे पर चलता है।

यदि आप मोटे कलम का उपयोग करते हैं, तो एक टेक्स्ट कैरेक्टर पतला दिखता है, जबकि चरित्र द्वारा लिया गया कुल क्षेत्र रूपरेखा के लिए बढ़ता है। दूसरे शब्दों में, रूपरेखा पाठ चरित्र में बदल जाती है।

मैं टेक्स्ट वर्णों को रूपरेखा से "हेलो प्रभाव" होने पर अपना मूल आकार और दृश्यता रखना चाहता हूं। आईई, मैं केवल एज लाइनों के बाहर पेंट करना चाहता हूं।

क्यूटी के साथ इस तरह के प्रभाव को लागू करने का सबसे आसान तरीका क्या है? मैं कुछ विचारों के साथ आया, लेकिन मुझे आश्चर्य है कि उनमें से कोई भी संभव है।

रूपरेखा के साथ योजना ए

ड्रा ग्रंथों, तो उल्लिखित लोगों से अधिक रूपरेखा के बिना एक ही ग्रंथों आकर्षित।

दुर्भाग्यवश, QTextCursor क्लासिक टाइपराइटर के साथ "ओवरड्राइंग" या "ओवरटाइपिंग" का समर्थन नहीं करता है। प्रदर्शन प्रदर्शन भी होगा।

योजना बी

क्यूटी पुस्तकालय संशोधित करें ताकि वह QPen साथ रूपरेखा ड्रॉ पहले, तो QBrush के साथ अंदर भरें। क्यूब्रश रूपरेखा के अंदर के हिस्से में पेंट करेगा और केवल बाहरी बरकरार छोड़ देगा।

मुझे यकीन नहीं है कि यह काम करता है और यदि संभव हो तो मैं क्यूटी लाइब्रेरी को संशोधित करना चाहता हूं।

योजना सी

स्विच QPainter की "CompositionMode" पाठ करने के लिए "QPainter :: CompositionMode_DestinationOver" ड्राइंग अस्थायी रूप से के लिए इस्तेमाल किया।

ऐसा करने के लिए, मुझे लगता है कि मुझे QTextBrowser जैसे Qt के टेक्स्ट-मैनिपुलेशन विगेट्स द्वारा बनाए गए और उपयोग किए जाने वाले निजी और अस्थायी QPainter को नियंत्रित करने की आवश्यकता है, लेकिन मुझे नहीं पता कि यह कैसे किया जा सकता है।

मैं क्यूटी प्रोग्रामिंग के लिए नया हूं और मैं एक्स विंडो पर क्यूटी 4.8.2 का उपयोग करता हूं।

आप निम्नलिखित कोड लाइनों (लाइन 156-164) को /usr/lib64/qt4/examples/richtext/calendar/mainwindow.cpp में जोड़कर, संकलित और इसे चलाने, और फ़ॉन्ट आकार को बढ़ाकर मेरी समस्या देख सकते हैं 40 या बड़ा

QTextCharFormat format = cursor.charFormat(); 
format.setFontPointSize(fontSize); 

QTextCharFormat boldFormat = format; 
boldFormat.setFontWeight(QFont::Bold); 

// Additional code lines for green outline : line 156 
QPen pen; 
pen.setStyle(Qt::SolidLine); 
pen.setWidthF(4); 
pen.setBrush(Qt::green); 
pen.setCapStyle(Qt::RoundCap); 
pen.setJoinStyle(Qt::RoundJoin); 
boldFormat.setTextOutline(pen); 
// The end of the additional code : line 164 

यदि आप मुझे जाने और मुझे शुरुआती संकेत देने का तरीका बता सकते हैं, तो मैं आपकी मदद की सराहना करता हूं।

+0

इयान अटकिन के लिए धन्यवाद, मैंने "पेंटर पथ" उदाहरण में देखा और मुझे लगता है कि मेरी योजना बी और सी क्यूटी के मौलिक डिजाइन के खिलाफ हैं। "विषम भी" भरने के नियम के साथ, क्यूपेन के साथ केवल किनारों की रेखाओं के बाहर पेंटिंग और क्यूब्रश के साथ अंदर भरने से "स्टार आकृति" और "ओवरलैपिंग स्क्वायर एंड सर्कल" उदाहरण के साथ बदसूरत परिणाम मिलेगा। –

+0

@ टापा, मैं इस प्रश्न को लंबे समय तक खुला छोड़ रहा हूं और मेरे पास इसे फिर से देखने का कोई समय नहीं था (मुझे किसी अन्य प्रोजेक्ट द्वारा घुमाया गया था)। मेरे देरी से जवाब के लिए मुझे बहुत खेद है। और, हां, मेरे सहयोगियों में से एक ने आपके समाधान के लिए एक समान तरीके से समस्या हल की। मैं आपके प्रश्न का उत्तर मेरे प्रश्न के उत्तर के रूप में स्वीकार करता हूं। आपका बहुत बहुत धन्यवाद। –

उत्तर

1

मुझे एक तरीका मिला है, QGraphicsView टेक्स्ट ऑब्जेक्ट्स के लिए इस तरह की रूपरेखा कैसे करें। मुझे लगता है, उदाहरण के लिए, आप QTextDocument (QTextEdit) के आधार पर किसी भी वर्ग के लिए इसका उपयोग कर सकते हैं।मैं एक वर्ग QGraphicsTextItem आधार पर बनाई गई है और इसके paint समारोह reimplemented किया है:

void paint (QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) 
{ QTextCharFormat format; 
    format.setTextOutline (QPen (Qt::white, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); // Color and width of outline 
    QTextCursor cursor (this->document()); 
    cursor.select (QTextCursor::Document); 
    cursor.mergeCharFormat (format); 
    QGraphicsTextItem::paint (painter, option, widget); 
    format.setTextOutline (QPen (Qt::transparent)); 
    cursor.mergeCharFormat (format); 
    QGraphicsTextItem::paint (painter, option, widget); 
} 

केवल बग मैं इस समाधान के लिए ध्यान दिया है - जब आप पाठ संपादित और कुछ पत्र का चयन शुरू, कतरन होती है। लेकिन यह लगभग अनजान है। गैर-संपादन योग्य वस्तुओं के लिए मुझे कोई भी बग नहीं मिल रही है।

लेकिन अगर आप (उदाहरण के लिए) QPushButton पाठ की रूपरेखा तैयार करना चाहते हैं, तो यह मामूली बात है (इस समस्या को कई बार चर्चा की गई) - अंदर reimplemented paintEventQPainterPath बनाते हैं, तो फोन path.addText, तो का उपयोग painter.strokePath, painter.fillPath - strokePath रूपरेखा बनाता है, और fillPath अग्रभूमि भरता है।

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