2010-01-16 16 views
8

Qt tabanlı bir uygulamada bir konsol giriş var, bu bir QLineEdit, tüm Ui QtDesigner aracılığıyla tasarlanmıştır. Giriş tarihini uygulamak için yukarı ve aşağı okları işlemenin kolay yolu nedir? Sadece, ben yukarı işlemek için görebileceğiniz hiçbir şekilde returnProcessed sinyalini göstermek ve oklar :(QLineEdit: yukarı ve aşağı okları nasıl tutmalı?

cevap

14

Eğer install event filter can ve pencere sınıfında satır düzenleme olayı izlemek Aşağıda bir örnek:.

class MainWindow : public QMainWindow { 
    Q_OBJECT 
... 
protected: 
    void changeEvent(QEvent *e); 
... 
}; 
: pencere sınıfı

beyan olay işleyicisi yöntemi

pencere yapıcısı

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

olay işleyicisi uygulaması: Bu yardımcı olur

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

umut, ben de aynı problem vardı

+1

Daha da basitleştirmenin bir yolu, olay filtresini QLineEdit'in kendisine eklemek olabilir. , birkaç QLineEdits uygulamasına uygulayabilirsiniz (olaya tepki verirken obj kullanmanız durumunda) – e8johan

+0

Teşekkürler, bir çekicilik gibi çalışır :) – grigoryvp

6

Sen QLineEdit alt sınıf ve özel tuşlar işlemek için sanal keyPressEvent yöntemini tekrar uygulamasını.

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); 
    } 
} 
aşağı 'yarmak git'
+0

Bu iyi bir fikir. Ancak QLineEdit alt sınıflama QtDesigner tarafından üretilen Ui ile birleştirmek nasıl? – grigoryvp

+0

Bakınız: http://doc.trolltech.com/4.6/designer-creating-custom-widgets.html –

+0

Yani, aşağı okları çalıştırmak için çalışırken tanımlayan tonlarca fonksiyonla bir QtDesigner eklentisini uygulamaya koymam gerekiyor "yeni" widget nasıl kullanılır? :( – grigoryvp

1

ilişkin, ama setFocus gereken başka forumlarda öğrenmek, örn .:

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

    this->setFocus(); 
} 

Benim için çalışıyor.

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

İlgili konular