[英]QTabWidget tab context menu
我需要在單擊選項卡時顯示上下文菜單,並且它需要對該特定選項卡做出反應。 有沒有辦法在不對其進行子類化的情況下做到這一點?
簡單的方法,但可能不是你需要的:
每當選項卡被更改(不一定被點擊)並在當前鼠標位置產生菜單時,這將獲得一個調用的函數。
復雜的方式,這正是你所描述的:
創建一個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.