5

ユーザーがドロップダウンリストからアイテムを削除できるように、QComboBox の ui を微調整しようとしています (最初にアイテムを選択する必要はありません)。

背景は、現在開いているデータ ファイルを示すために QComboBox を使用していることです。最近開いたファイルのキャッシュとしても使用しています。ユーザーがもうリストしたくないエントリを削除できるようにしたいと思います。これは、単に削除キーを押すか、コンテキスト メニューを押すか、または実装が簡単なものであれば何でもかまいません。最初にアイテムを選択することに頼りたくありません。同様の動作が Firefox でも見られます。Firefox では、エントリ フィールドの古いキャッシュされた候補が削除される可能性があります。

QComboBox で使用されるリスト ビューをサブクラス化することを検討していましたが、開始するのに十分なドキュメントが見つかりませんでした。

ヒントや提案をいただければ幸いです。私は PyQt を使用していますが、C++ サンプルでは問題ありません。

4

5 に答える 5

6

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);
于 2014-11-17T16:16:50.220 に答える
1

このスレッドに遅れて申し訳ありませんが、他の誰かが私のように探している場合に備えて、私が見つけた他の方法を提供したいと思います。メソッドは 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);
}

それでおしまい。

于 2019-07-02T10:22:52.493 に答える