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

Alles rund um die Programmierung mit Qt
Antworten
Codiac
Beiträge: 21
Registriert: 23. Mai 2013 11:00

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

Beitrag 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?
Zuletzt geändert von Codiac am 21. November 2013 10:42, insgesamt 1-mal geändert.
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

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

Beitrag 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;
        }
Codiac
Beiträge: 21
Registriert: 23. Mai 2013 11:00

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

Beitrag 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!
Antworten