Seite 1 von 1

QTextCursor und select(QTextCursor::WordUnderCursor)

Verfasst: 16. September 2008 19:49
von QtBerserker
Hi,

für einen Completer für python suche ich mir den Text unter dem Cursor:

Code: Alles auswählen

    QTextCursor textCursor = this->textCursor();
    textCursor.select(QTextCursor::WordUnderCursor);
    return textCursor.selectedText();
jedoch stößt das Ganze an die Grenzen des Syntax: als ein Wort sehe ich auch sys.stdin (mit '.' drinnen). Hier kommt die Impementation zum tragen (qtextcursor.cpp), da Begin/EndWord markiert wird. Insbesondere das Endword bereitet mir die Probleme:

Code: Alles auswählen

    case QTextCursor::EndOfWord: {
        QTextEngine *engine = layout->engine();
        const HB_CharAttributes *attributes = engine->attributes();
        const QString string = engine->layoutData->string;

        const int len = layout->engine()->layoutData->string.length();
        if (relativePos >= len)
            return false;
        relativePos++;
        while (relativePos < len
               && !attributes[relativePos].whiteSpace
               && !engine->atWordSeparator(relativePos))
            relativePos++;

        newPosition = blockIt.position() + relativePos;
        break;
d.h. die Qt Engine bestimmt, wo das Word zu Ende ist. Gibt es einen Weg, den Punkt hier als Endword Marker zu umgehen durch irgendwelche Konfiguration? Oder einen anderen, einfachen Weg? C++ hat das gleiche Problem mit dem Zugriff auf Class member.

Grüße
Olaf

Verfasst: 17. September 2008 08:19
von QtBerserker
eine RE hilft mir auch nicht viel (zumahl ich mir nicht im Klaren bin über die Richtigkeit von "(\w+(\.\w+)*)\.(\w+)" bzw. escaped ""(\\w+(\\.\\w+)*)\\.(\\w+)"" ).

Die Idee ist, den textblock danach zu durchforsten und dann mit der aktuellen Cursurposition zu vergleichen - diese sollte irgendwo in der Mitte davon liegen.

qt-src/examples/tools/regex/regexp liefert den kompletten match (Auch wenn zwischendurch einige Captures leer bleiben je nach Ausdruck), aber es löst nicht das Problem der Cursur Position, wenn zB da steht:

foo.bar = sys.stdin.readline() - hier passt nur foo.bar

Irgendwelche Ideen?

Grüße
Olaf