11
votes

QLineDit: Comment gérer les flèches de haut en bas?

J'ai une entrée de console dans mon application basée sur qt , c'est un QLineDit , tout interface utilisateur est conçu via qtdesigner . Est-il un moyen facile de gérer des flèches de haut en bas afin de mettre en œuvre l'historique des intrants? Le «Code> Signal» / code> Signal Signal , sans façon, je ne peux pas voir pour gérer les flèches de haut en bas: (

qt

0 commentaires

4 Réponses :


7
votes

Vous pouvez sousclure QLineDit et ré-implémenter la méthode de KeyPressEvent virtuel pour gérer vos clés spéciales.

void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Up){
        // move back in history
    }
    else if(event->key() == Qt::Key_Down){
        // move forward in history
    }
    else{
        // default handler for event
        QLineEdit::keyPressEvent(event);
    }
}


5 commentaires

C'est une bonne idée. Mais comment combiner le sous-classement QLineDit avec UI généré par qtdesigner?


Ainsi, afin de monter des flèches d'annonce, je dois mettre en œuvre un plugin QTDesigner entier avec des tonnes de fonctions qui définissent comment utiliser un "nouveau" widget? :(


En dehors de l'utilisation des filtres d'événements (voir ma réponse), vous pouvez définir la même méthode de la fenêtre de la fenêtre et voir si les événements clés de la flèche UP \ bas de Linedit. Les événements non confondus sont propagés à la chaîne de widget parent jusqu'à ce qu'un widget l'accepte avec acceptation () ou un filtre d'événement consomme.


@Eye of Hell, en plus des plug-ins pour designer, vous pouvez également ajouter un QLineDIT à votre formulaire, cliquez avec le bouton droit de la souris et "Promouvoir"-le à une classe dérivée. Fonctionne comme un charme pour des cas comme celui-ci.


@cjhuitt Merci beaucoup, c'est vraiment utile!



18
votes

Vous pouvez Installez le filtre d'événement et regardez votre événement de modification de ligne dans votre classe de fenêtre. Ci-dessous est un exemple:

Déclarez la méthode du gestionnaire d'événements sur votre classe de fenêtre: p> xxx pré>

constructeur de fenêtre p> xxx pré>

événement Mise en œuvre du gestionnaire: P>

bool MainWindow::eventFilter(QObject* obj, QEvent *event)
{
    if (obj == ui->lineEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
            if (keyEvent->key() == Qt::Key_Up)
            {
                 qDebug() << "lineEdit -> Qt::Key_Up";
                 return true;
            }
            else if(keyEvent->key() == Qt::Key_Down)
            {
                qDebug() << "lineEdit -> Qt::Key_Down";
                return true;
            }
        }
        return false;
    }
    return QMainWindow::eventFilter(obj, event);
}


2 commentaires

Une façon de simplifiera encore, il s'agirait d'ajouter le filtre d'événement au QLineDit lui-même. Ensuite, vous n'auriez pas à vous soucier de l'argument Obj, plus, vous pouvez l'appliquer à plusieurs QLineDits (étant donné que vous utilisez obj lors de la réaction à l'événement)


Juste pour ajouter plus loin à cela, cela n'a pas besoin d'être dans MainWindow, il peut être dans n'importe quelle classe ou qwidget.



1
votes

J'ai eu le même problème, mais je découvre dans d'autres forums que vous devez SETFOCUS , par exemple: xxx

Ça fonctionne pour moi.

Référence: http://www.qtforum.org/article/ 28240 / HOW-TO-GET-FLOW-KEYS.HTML


0 commentaires

0
votes

Pour moi dans Pyqt, cela ne fonctionnait pas, xxx

mais cela a fonctionné, xxx


0 commentaires