मैं चाहता हूं कि मेरा QLineEdit उपवर्ग वास्तविक पाठ की तुलना में एक अलग पाठ (वास्तव में, HTML) को चित्रित करे।

अधिक विशेष रूप से, जब कर्सर स्ट्रिंग के अंत में होता है, तो उसे ऐसे पेंट करना चाहिए जैसे कि (HTML) टेक्स्ट text() + "<font color='gray'>ThisIsExtraText</font>" होगा:

enter image description here

यह कैसे हासिल किया जा सकता है?

मैं पेंट() विधि को ओवरराइड करने के बारे में सोच रहा हूं, लेकिन मुझे वास्तव में किसी भी पेंट व्यवहार को बदलने की ज़रूरत नहीं है, बस इसे एक अलग टेक्स्ट पेंट करना चाहिए।

हालांकि, मैं चाहता हूं कि हर तरह से, विजेट की टेक्स्ट() संपत्ति वास्तविक टेक्स्ट रखती है, न कि संशोधित टेक्स्ट।

अधिक विवरण: जिस व्यवहार को मैं कार्यान्वित करने का प्रयास कर रहा हूं वह प्लेसहोल्डर टेक्स्ट के समान है, लेकिन यह तब प्रदर्शित होता है जब लाइन-एडिट विजेट में कुछ टेक्स्ट होता है (प्लेसहोल्डर के विपरीत, जो कोई टेक्स्ट नहीं होने पर प्रदर्शित होता है)।


मुझे मिली कुछ समस्याएं:

QLineEdit HTML स्वीकार नहीं करता है। मैं सोच रहा था कि मैं QLineEdit को दो पास में प्रस्तुत कर सकता हूं:

void MyLineEdit::paintEvent(QPaintEvent *event)
{
    if(cursorPosition() == text().length())
    {
        bool oldBlockSignals = blockSignals(true);

        // save old state:
        QString oldText = text();
        QString oldStyleSheet = styleSheet();
        bool oldReadOnly = isReadOnly();

        // change state:
        setText(oldText + "ThisIsExtraText");
        setStyleSheet("color: gray");
        setReadOnly(true);

        // paint changed state:
        QLineEdit::paintEvent(event);

        // restore state:
        setText(oldText);
        setStyleSheet(oldStyleSheet);
        setReadOnly(oldReadOnly);

        blockSignals(oldBlockSignals);
    }
    QLineEdit::paintEvent(event);
}

लेकिन पेंटइवेंट पृष्ठभूमि को साफ कर देगा।

यहां तक ​​कि अगर मैं रंग बदलना छोड़ देता हूं, तो टेक्स्ट गलत स्थिति में कर्सर के साथ प्रस्तुत किया जाता है।

3
fferri 19 मई 2018, 12:12

2 जवाब

सबसे बढ़िया उत्तर

QLineEdit आंतरिक रूप से रेंडरिंग के लिए QTextLayout का उपयोग करता है। आप इसका इस्तेमाल कर सकते हैं "ThisIsExtraText" के लिए इसके लिए QTextLayout उदाहरण बनाकर और QLineEdit के उपवर्ग के paintEvent से आरेखण करके।

3
joe_chip 19 मई 2018, 13:00

@ जो_चिप के उत्तर का कार्यान्वयन:

void MyLineEdit::paintEvent(QPaintEvent *event)
{
    QLineEdit::paintEvent(event);

    if(!hasFocus()) return;
    if(cursorPosition() < txt.length()) return;

    ensurePolished(); // ensure font() is up to date

    QRect cr = cursorRect();
    QPoint pos = cr.topRight() - QPoint(cr.width() / 2, 0);

    QTextLayout l("ThisIsExtraText", font());
    l.beginLayout();
    QTextLine line = l.createLine();
    line.setLineWidth(width() - pos.x());
    line.setPosition(pos);
    l.endLayout();

    QPainter p(this);
    p.setPen(QPen(Qt::gray, 1));
    l.draw(&p, QPoint(0, 0));
}
4
fferri 19 मई 2018, 20:11