2010-01-16 8 views
8

J'ai une entrée de console dans mon application basée Qt, c'est un QLineEdit, tous Ui est conçu via QtDesigner. Est-ce un moyen facile de gérer les flèches haut et bas afin de mettre en œuvre l'historique des entrées? Le « aller à la fente » ne montrer le signal returnProcessed, aucun moyen que je peux voir pour gérer flèches haut et bas :(QLineEdit: comment gérer les flèches haut et bas?

Répondre

14

vous pouvez install event filter et regarder votre événement d'édition de ligne dans votre classe de fenêtre Voici un exemple:.

méthode de gestionnaire d'événements

annoncez votre classe de fenêtre:

class MainWindow : public QMainWindow { 
    Q_OBJECT 
... 
protected: 
    void changeEvent(QEvent *e); 
... 
}; 

constructeur de fenêtre

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ... 
    ui->lineEdit->installEventFilter(this); 
} 
mise en œuvre du gestionnaire d'événements

:

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); 
} 

espérons que cette aide, ce qui est

+1

Une façon de simplifier encore serait d'ajouter le filtre d'événement au QLineEdit lui-même, alors vous ne devriez pas vous soucier de l'argument obj, plus , vous pouvez l'appliquer à plusieurs QLineEdits (étant donné que vous utilisez obj en réagissant à l'événement) – e8johan

+0

Merci, fonctionne comme un charme :) – grigoryvp

6

Vous pouvez sous-classe QLineEdit et re-mettre en œuvre la méthode de keyPressEvent virtuelle 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); 
    } 
} 
+0

Il est une bonne idée. Mais comment combiner QLineEdit sous-classe avec Ui généré par QtDesigner? – grigoryvp

+0

Voir: http://doc.trolltech.com/4.6/designer-creating-custom-widgets.html –

+0

Donc, afin de se lever les flèches ad down fonctionnant, j'ai besoin de mettre en œuvre un plugin QtDesigner entier avec des tonnes de fonctions qui définit comment utiliser un "nouveau" widget? :( – grigoryvp

1

J'ai eu le même problème, mais je trouve dans d'autres forums que vous devez setFocus, par exemple:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ... 
    ui->lineEdit->installEventFilter(this); 

    this->setFocus(); 
} 

Ca marche pour moi.

Référence: http://www.qtforum.org/article/28240/how-to-get-arrow-keys.html

Questions connexes