10

タブがクリックされるたびにコンテキスト メニューを表示する必要があり、その特定のタブに反応する必要があります。サブクラス化せずにこれを行う方法はありますか?

4

4 に答える 4

5

簡単な方法ですが、必要なものが正確ではない可能性があります。

  1. QTabWidgetの「currentChanged」シグナルに接続します
  2. 信号に接続されているスロットで、QMenuを作成し、必要に応じて入力します
  3. 最後に、シグナルに接続されているスロットで、QMenu :: exec(QCursor :: pos())を呼び出します。

これにより、タブが変更されるたびに呼び出される関数が取得され(必ずしもクリックされる必要はありません)、現在のマウス位置にメニューが生成されます。

あなたが説明することを正確に行う複雑な方法:

  1. QTabWidgetでQObject::installEventFilterを呼び出して、QTabWidgetのすべてのイベントが独自のオブジェクトにリダイレクトされるようにします。
  2. 独自のオブジェクトで、QObject :: customEventを再実装し、すべてのQMouseEventイベントを処理します。
  3. 必要に応じてQMenuにデータを入力し、処理しているQMouseEventの位置でQMenu::execを呼び出します。
于 2009-09-30T08:52:04.917 に答える
3

QMenu を作成します。

m_menu = new QMenu;

アクションをメニューに追加します。

タブ バーでコンテキスト メニューが要求されたときに呼び出されるスロットを作成します。

connect(m_tabWidget->tabBar(), &QTabBar::tabBarClicked, this, &MyClass::on_contextMenuRequested);

スロットで、メニューを表示します。スロットの定義:

void MyClass::on_contextMenuRequested(int tabIndex)
{
    m_menu->popup(QCursor::pos());
}

別の関数で現在のタブのインデックスが必要な場合は、次を使用します。

m_tabWidget->tabBar()->currentIndex()
于 2019-05-17T21:13:44.007 に答える
0

QTabWidgetを継承する独自のクラスを作成し、右クリックでコンテキストメニューを作成できるMousePressEvent(QMouseEvent)保護関数をオーバーライドする必要があると思います。

于 2009-09-30T08:52:01.567 に答える