2013-07-23 1688 views
3

我試圖以用戶可以從下拉列表中刪除項目(而不先選擇它們)的方式來調整QComboBox的用戶界面。從用戶從QComboBox中刪除項目

背景是我正在使用QComboBox來指示現在打開哪個數據文件。我也將它用作最近打開文件的緩存。我希望用戶能夠刪除他不想再列出的條目。這可以通過點擊刪除鍵或上下文菜單,或者直接執行。我不想依賴首先選擇的項目。在Firefox中可以找到類似的行爲,在這裏可以刪除舊的緩存建議。

我正在考慮子類化QComboBox使用的列表視圖,但是,我沒有找到足夠的文檔讓我開始。

我將不勝感激任何提示和建議。我正在使用PyQt,但對於C++示例沒有任何問題。

+0

我在這裏找不到在Firefox中的功能(OS X)。它看起來怎樣?像這樣編輯組合框聽起來很神祕/不可發現/不可用(但我可能是錯的)。 –

+0

@FrankOsterfield,我再次檢查,Firefox使用移位刪除(至少在Windows)[鏈接](http://lifehacker.com/192255/delete-firefox-auto+complete-entries),我同意它是神祕的和不可發現的(如許多鍵盤快捷鍵)。我認爲它不可用。刪除不再存在的文件的鏈接可能是最簡單的。 – Peter

回答

4

我使用installEventFilter文檔中的代碼解決了此問題。

//must be in a header, otherwise moc gets confused with missing vtable 
class DeleteHighlightedItemWhenShiftDelPressedEventFilter : public QObject 
{ 
    Q_OBJECT 
protected: 
    bool eventFilter(QObject *obj, QEvent *event); 
}; 

bool DeleteHighlightedItemWhenShiftDelPressedEventFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::KeyPress) 
    { 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
     if (keyEvent->key() == Qt::Key::Key_Delete && keyEvent->modifiers() == Qt::ShiftModifier) 
     { 
      auto combobox = dynamic_cast<QComboBox *>(obj); 
      if (combobox){ 
       combobox->removeItem(combobox->currentIndex()); 
       return true; 
      } 
     } 
    } 
    // standard event processing 
    return QObject::eventFilter(obj, event); 
} 

myQComboBox->installEventFilter(new DeleteHighlightedItemWhenShiftDelPressedEventFilter); 
3
comboBox->removeItem(int index) // removes item at index 
+0

對不起,不夠清楚。問題是:gui的用戶如何表明他或她希望先移除某個項目而不選擇該項目。一旦清楚了,從comboBox中刪除一個項目的確很簡單。 – Peter

+3

@ gui的用戶如何指示她或他希望先移除項目而不先選擇項目......這取決於應用程序的邏輯。也許'QComboBox'不適合呈現您的數據。我認爲你的情況'QListWidget'更合適。 –