Seite 1 von 1

QCompleter und Sonderzeichen

Verfasst: 2. April 2011 17:13
von Skatol
Hallo,

ich habe mir nach dem Custom Completer Beispiel eine Autovervollständigung gebaut, die auch soweit mit "normalen" Wörtern funktioniert. Wenn ich jedoch Ausdrücke mit Klammern ()[]{}, z.B. "[[Testfunktion", in der Wortliste verwende, werden diese von der Autovervollständigung ignoriert. Wie muss ich denn das Beispiel modifizieren, damit auch Ausdrücke, die Klammern enthalten, funktionieren?

Habe versucht die Klammern mit Backslash ("\\[\\[Testfunktion") zu escapen, jedoch ohne Erfolg. Zusätzlich habe ich die Klammern aus eow (Quellcode) entfernt , was jedoch auch nichts gebracht hat:

Code: Alles auswählen

static QString eow("~!@#$%^&*_+|:\"<>?,./;'\\-="); // end of word
Was habe ich denn im Code noch übersehen?

Verfasst: 10. April 2011 18:22
von Skatol
Hi,

niemand, der mir weiterhelfen kann? Zumindest ist mir in den letzten Tagen aufgefallen, dass sich das Completer-Popup schließt, sobald die Shift-, Strg-Taste etc. gedrückt wird. Das kann ich aus dem Code auch soweit nachvollziehen und deshalb kann man keine Sonderzeichen eintippen... Nun weiß ich leider trotzdem nicht weiter, wie ich den Code verändern muss, damit die Eingabe von Klammern bei der Codevervollständigung funktioniert und das Popup offen bleibt. Weiß da jemand weiter?

Code: Alles auswählen

 void TextEdit::keyPressEvent(QKeyEvent *e)
 {
     if (c && c->popup()->isVisible()) {
         // The following keys are forwarded by the completer to the widget
        switch (e->key()) {
        case Qt::Key_Enter:
        case Qt::Key_Return:
        case Qt::Key_Escape:
        case Qt::Key_Tab:
        case Qt::Key_Backtab:
             e->ignore();
             return; // let the completer do default behavior
        default:
            break;
        }
     }

     bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E
     if (!c || !isShortcut) // do not process the shortcut when we have a completer
         QTextEdit::keyPressEvent(e);

     const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier);
     if (!c || (ctrlOrShift && e->text().isEmpty()))
         return;

     static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word
     bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift;
     QString completionPrefix = textUnderCursor();

     if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3
                       || eow.contains(e->text().right(1)))) {
         c->popup()->hide();
         return;
     }

     if (completionPrefix != c->completionPrefix()) {
         c->setCompletionPrefix(completionPrefix);
         c->popup()->setCurrentIndex(c->completionModel()->index(0, 0));
     }
     QRect cr = cursorRect();
     cr.setWidth(c->popup()->sizeHintForColumn(0)
                 + c->popup()->verticalScrollBar()->sizeHint().width());
     c->complete(cr); // popup it up!
 }