簡體   English   中英

QTabWidget 選項卡上下文菜單

[英]QTabWidget tab context menu

我需要在單擊選項卡時顯示上下文菜單,並且它需要對該特定選項卡做出反應。 有沒有辦法在不對其進行子類化的情況下做到這一點?

簡單的方法,但可能不是你需要的:

  1. 連接到QTabWidget的'currentChanged'信號
  2. 在連接到信號的插槽中,創建一個QMenu並根據需要填充它
  3. 最后,在連接到信號的插槽中,調用QMenu :: exec(QCursor :: pos())

每當選項卡被更改(不一定被點擊)並在當前鼠標位置產生菜單時,這將獲得一個調用的函數。

復雜的方式,這正是你所描述的:

  1. QTabWidget上調用QObject :: installEventFilter ,以便將QTabWidget上的所有事件重定向到您自己的對象。
  2. 在您自己的對象中,重新實現QObject :: customEvent並處理所有QMouseEvent事件。
  3. 根據需要填充QMenu並在您正在處理的QMouseEvent的位置調用QMenu :: exec。

創建一個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()

根據@Petrzio Berkerle 的評論,在https://www.qtcentre.org/threads/16703-QTabBar-Context-menu-on-tab?p=84057#post84057找到的解決方案對我來說效果很好。 (實際上,這是唯一有效的方法。)

來自那里的帖子的代碼(通過“精神”):

    ...
    m_tabBar = new QTabBar();
    m_tabBar->addTab(tr("OK"));
    m_tabBar->addTab(tr("NO"));
    m_tabBar->addTab(tr("IGNORE"));
    m_tabBar->setContextMenuPolicy(Qt::CustomContextMenu);
     
    connect(m_tabBar, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(showContextMenu(const QPoint &)));
    ...
     
    void Test::showContextMenu(const QPoint &point)
    {
        if (point.isNull())
            return;
     
        int tabIndex = m_tabBar->tabAt(point);
        QMenu menu(this);
        if (!tabIndex)
            menu.addAction(tr("OK"));
        else if (tabIndex == 1)
            menu.addAction(tr("NO"));
        else if (tabIndex == 2)
            menu.addAction(tr("IGNORE"));
     
        menu.exec(m_tabBar->mapToGlobal(point));
    }

我認為您需要創建自己的類,該類繼承自QTabWidget並覆蓋MousePressEvent(QMouseEvent)保護功能,您可以在其中右鍵單擊創建上下文菜單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM