2010-01-16 6 views
8

Tengo una entrada de consola en mi aplicación Qt, es un QLineEdit, todo Ui está diseñado a través de QtDesigner. ¿Hay alguna manera fácil de manejar las flechas hacia arriba y hacia abajo para implementar el historial de entrada? El 'ir a la ranura' sólo mostrar returnProcessed señal, no hay manera que puedo ver para manejar flechas arriba y abajo :(QLineEdit: cómo manejar las flechas arriba y abajo?

Respuesta

14

que pueda install event filter y ver tu edición evento línea en su clase de ventana a continuación se muestra un ejemplo:.

método de control de eventos de declarar en su clase de ventana:

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

ventana constructor

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

aplicación de controlador de eventos:

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

esperanza que esta ayuda, que se refiere a

+1

Una forma de simplificar aún más sería agregar el filtro de eventos al QLineEdit en sí mismo. Entonces no tendría que preocuparse por el argumento obj, más , puedes aplicarlo a varios QLineEdits (dado que usas obj cuando reaccionas al evento) – e8johan

+0

Gracias, funciona como un encanto :) – grigoryvp

6

Usted puede subclase QLineEdit y volver a poner en práctica el método keyPressEvent virtual para manejar sus teclas especiales.

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

Es una buena idea. Pero, ¿cómo combinar la subclasificación QLineEdit con el Ui generado por QtDesigner? – grigoryvp

+0

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

+0

Por lo tanto, para poder desarrollar las flechas del anuncio, necesito implementar un complemento completo de QtDesigner con toneladas de funciones que definen cómo usar un widget "nuevo"? :( – grigoryvp

1

que tenía el mismo problema, pero encuentro a cabo en otros foros que necesita setFocus, por ejemplo:

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

    this->setFocus(); 
} 

Funciona para mí.

Referencia: http://www.qtforum.org/article/28240/how-to-get-arrow-keys.html

Cuestiones relacionadas