2010-01-16 31 views
8

मेरे पास Qt आधारित एप्लिकेशन में एक कंसोल इनपुट है, यह QLineEdit है, सभी यूआई QtDesigner के माध्यम से डिज़ाइन किए गए हैं। इनपुट इतिहास को लागू करने के लिए ऊपर और नीचे तीरों को संभालने का यह कोई आसान तरीका है? केवल returnProcessed संकेत कोई रास्ता नहीं मैं संभाल करने के लिए देख सकते हैं दिखाने के लिए, और तीर :(QLineEdit: तीर ऊपर और नीचे कैसे संभालें?

उत्तर

14

आप कर सकते हैं install event filter और अपने विंडो वर्ग में अपनी लाइन संपादित घटना को देखने के नीचे एक उदाहरण है:।

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

अपने विंडो वर्ग पर घोषित ईवेंट हैंडलर विधि

खिड़की निर्माता

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

ईवेंट हैंडलर कार्यान्वयन:

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

आशा है कि यह मदद करता है,

+1

आगे सरल बनाने का एक तरीका ईवेंट फ़िल्टर को QLineEdit में जोड़ना होगा। फिर आपको obj तर्क, प्लस के बारे में परवाह नहीं करना होगा , आप इसे कई QLineEdits पर लागू कर सकते हैं (यह देखते हुए कि आप ईवेंट पर प्रतिक्रिया करते समय ओबीजे का उपयोग करते हैं) – e8johan

+0

धन्यवाद, एक आकर्षण की तरह काम करता है :) – grigoryvp

6

आप QLineEdit उपवर्ग कर सकते हैं और अपने विशेष कुंजियों को संभालने के लिए आभासी keyPressEvent विधि फिर से लागू करते हैं।

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

यह एक अच्छा विचार है। लेकिन QtDesigner- उत्पन्न यूआई के साथ subclassing QLineEdit कैसे गठबंधन करने के लिए? – grigoryvp

+0

देखें: http://doc.trolltech.com/4.6/designer-creating-custom-widgets.html –

+0

तो, विज्ञापन नीचे तीरों को ऊपर उठाने के लिए मुझे एक संपूर्ण QtDesigner प्लगइन को कार्यान्वित करने की आवश्यकता है जो परिभाषित करता है एक "नया" विजेट का उपयोग कैसे करें? :( – grigoryvp

1

मैं एक ही समस्या थी संबंध है, लेकिन मैं अन्य मंचों कि आप setFocus की जरूरत में पता लगाना, उदाहरण:

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

    this->setFocus(); 
} 

यह मेरे लिए काम करता है।

संदर्भ: http://www.qtforum.org/article/28240/how-to-get-arrow-keys.html

संबंधित मुद्दे