最近做一個Qt項目,界面中有一個QComboBox,這里稱為combobox。要求不用鼠標操作,用按鍵,在combobox未彈出菜單的情況,按上下左右鍵是選擇另外widget,在彈出菜單的情況下,是選擇選項。
因為要求界面中的各個widget必須要能夠按照自己定義的順序被選取(按上下左右鍵),所以只能自己重寫按鍵響應,於是我給combobox安裝了過濾器,自己對combobox進行按鍵響應。
有兩個難點:
1.如果判斷combobox是彈出了菜單還是未彈出菜單的狀態
2.如果在彈出菜單的情況下,如何在對上下移動做按鍵響應(也就是高亮指定的項)
1.在多次試驗的情況我發現combobox->view()->isVisable()可以用來判斷是否是彈出了菜單。
2.試了很多種辦法都沒法解決。
最后在查閱了源代碼的情況下,發現彈出的菜單是由combobox中的view來管理的。而view有一個selectionModel是用來管理選項的高亮的。終於找到了正確的使用方法。
combobox->view()->selectionModel()->setCurrentIndex(combobox->model()->index(index,combobox->modelColumn(),combobox->rootModelIndex()),QItemSelectionModel::ClearAndSelect);
也許還有更好的辦法,或者是我走入了死胡同,暫時先這么着吧。
補充說明,查看源代碼之后,comboBox自己默認的按鍵響應里會響應QEvent::ShortCutOverride這個事件,當按下ENTER,RETURN鍵時會響應此事件執行hidePopup()