2013-07-23 132 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'更合适。 –