Seite 1 von 1

[gelöst]QTablewidgetItem->setText() - unerwünschtes Ergebnis

Verfasst: 20. November 2013 13:15
von Codiac
Hallo zusammen,

ich möchte die Eingabe von Sonderzeichen in ein QTablewidgetItem vereinfachen. Dazu werte ich im Eventfilter die Tastaturereignisse aus und hänge erkannte Sonderzeichen an denZellentext:

Code: Alles auswählen

myClass::myClass(QWidget *parent)
{
    ...
    myTable->installEventFilter(this);
    ...
}

bool myClass::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        
        switch(keyEvent->key())
        {
            case Qt::Key_F1:    addSpecialKey("Ø");    break;
            case Qt::Key_F2:    addSpecialKey("±");    break;
            ....
            default:           keyEvent->ignore();    break;
        }
    }
    else
    {
        return QObject::eventFilter(obj, event);
    }
}

void myClass::addSpecialKey(const char *text)
{
    ...
    myTable->currentItem()->setText(myTable->currentItem()->text() + text);
    ...
}
Jetzt kann ich per Tastatur weitere (Normal-)Zeichen in die Zelle schreiben und diese auch sehen. Wenn ich dann aber noch ein Sonderzeichen über die Methode addSpecialKey() anhänge, ohne die Zelle zwischendurch zu verlassen, sehe ich nur noch die beiden Sonderzeichen in der Tabelle.

Verlasse ich die Zelle vor dem zweiten Sonderzeichen, betrete sie erneut und hänge dann das Sonderzeichen an, bekomme ich das gewünschte Ergebnis.

Was mache ich falsch?

Re: QTablewidgetItem->setText() - unerwünschtes Ergebnis

Verfasst: 21. November 2013 09:15
von archer
Der Text den du eingeben hast wird nur im Editor-Widget der Zelle sein und noch nicht in der Zelle selber.
Wenn du diese verläßt wird der Text aus dem Editor in die Tabellenzelle geschrieben.
Model-View-Delegate Konzept.
Vielleicht solltest du dir ein Delegate schreiben welches die Sonderzeichen austauscht.
Oder probier mal das, so tausche ich Zeichen aus:

Code: Alles auswählen

        QKeyEvent* pKeyEvent = static_cast<QKeyEvent*>(apEvent);
        if (pKeyEvent->key() == Qt::Key_F1)
        {
            QKeyEvent Event(
                    QEvent::KeyPress,
                    Qt::Key_Period,
                    pKeyEvent->modifiers(),
                    "Ø",
                    pKeyEvent->isAutoRepeat(),
                    pKeyEvent->count());

            QCoreApplication::sendEvent(apObject, &Event);
            return true;
        }

Re: QTablewidgetItem->setText() - unerwünschtes Ergebnis

Verfasst: 21. November 2013 10:42
von Codiac
Ich habe den Eventfilter etwas erweitert:

Code: Alles auswählen

        switch(keyEvent->key())
        {
            ...
            case Qt::Key_Backspace:
            {
                QString txt = myTable->currentItem()->text();
                if(txt.size())
                {
                    txt.chop(1);
                    myTable->currentItem()->setText(txt);
                }
                return(true);
            }

            default:
            {
                if(keyEvent->key() >= Qt::Key_Space && keyEvent->key() <= Qt::Key_ydiaeresis)
                {
                     addSpecialKey((const char*)keyEvent->text().left(1).constData());
                     return(true);
                }
                return(false);
             }
Jetzt funktioniert die Eingabe wie erwartet, da jetzt vermutlich alle Zeichen erstmal in den Editor kommen.
Da ich aber nicht sagen kann, ob ich jede mögliche Taste berücksichtigt habe, werde ich mir trotzdem mal das Thema Delegates anschauen.

Jedenfalls danke für die Hilfe!