このスレッドに遅れて申し訳ありませんが、他の誰かが私のように探している場合に備えて、私が見つけた他の方法を提供したいと思います。メソッドは Qt 5.6 でテストされています。他のバージョンで動作することは保証できません。
1 つの可能性は、QCombobox の view() の「pressed()」シグナルをリッスンすることです。そうすれば、マウスの右ボタンを使用してリストからアイテムを削除できます。view() が常に使用可能で、NULL になることはなく、アイテムが表示されている間はアイテムを削除できることに驚いたので、次のコードは非常にうまく機能します。
class MyCombobox : public QComboBox
{
Q_OBJECT
public: MyCombobox(QWidget *pParent = NULL);
protected slots: void itemMouseDown(const QModelIndex &pIndex);
};
MyCombobox::MyCombobox(QWidget *pParent)
{
connect( QComboBox::view(), SIGNAL(pressed(const QModelIndex &)),
this, SLOT(itemMouseDown(const QModelIndex &)) );
}
void MyCombobox::itemMouseDown(const QModelIndex &pIndex)
{
if( QApplication::mouseButtons() == Qt::RightButton )
{
QComboBox::model()->removeRow(pIndex.row());
}
}
2 番目のオプションは、イベント フィルターをインストールすることですが、ビューにもインストールします。そうすれば、削除キーなどを使用してアイテムを削除できます。NULL ポインターと無効な行インデックスをテストすることは良い考えかもしれませんが、わかりやすくするために省略しました。
class MyCombobox : public QComboBox
{
Q_OBJECT
public: MyCombobox(QWidget *pParent = NULL);
protected: bool eventFilter(QObject *pWatched, QEvent *pEvent);
};
MyCombobox::MyCombobox(QWidget *pParent)
{
QComboBox::view()->installEventFilter(this);
}
bool MyCombobox::eventFilter(QObject *pWatched, QEvent *pEvent)
{
if( pEvent->type() == QEvent::KeyPress )
{
QKeyEvent *tKeyEvent = static_cast<QKeyEvent*>(pEvent);
if( tKeyEvent->key() == Qt::Key_Delete )
{
QComboBox::model()->removeRow(QComboBox::view()->currentIndex().row());
return true;
}
}
return QObject::eventFilter(pWatched, pEvent);
}
それでおしまい。