2013-09-21 40 views
1

我創建了一個簡單的QListView添加了一個QStringListModel,允許添加項目和他們的文本編輯。但我不希望允許添加空字段,並且我部分通過使用來自模型的dataChanged信號來實現此目的,如果列表項失去焦點而沒有插入文本或用戶按下Enter鍵而不添加文本,則發出該信號。Esc按鍵事件QListView

但是,如果您按下Esc鍵,該字段將保持爲空,並且不會發出dataChanged信號。如果該字段留空而沒有重載QListView類,這將是單調乏味的(我使用設計器創建表單),我該如何得到通知?

是否有另一個信號發出或我可以用來實現這個信號?

謝謝!

回答

4

使用event filters在主GUI類:

void GUI::GUI() 
{  
    ui->mListView->installEventFilter(this); 
} 
bool GUI::eventFilter(QObject *object, QEvent *event) 
{ 
    if (object == ui->mListView && event->type() == QEvent::KeyPress) { 
     QKeyEvent *ke = static_cast<QKeyEvent *>(event); 
     if (ke->key() == Qt::Key_Escape) 
      // special Esc handling here 
    } 
    else 
     return false; 
} 

它易於使用您的自定義小部件在Qt Designer中。右鍵單擊QListView並選擇Promote to ...,然後添加一個新類並將其應用於該窗口小部件。

http://qt-project.org/doc/qt-4.8/designer-using-custom-widgets.html

+0

您確定列表視圖是接收關鍵事件的對象嗎?當用戶編輯一個列表視圖項時,有一個行編輯小部件可以處理用戶輸入,所以編輯器可能也處理關鍵事件? – vahancho

+0

那麼,那可能是真的,我從來沒有使用QListView。但是,如果這不起作用,我認爲沒有其他辦法可以做到這一點......但是,在Qt Designer中使用自定義小部件很簡單,我會將其添加到我的答案中。 – headsvk