每当单击选项卡并且它需要对该特定选项卡做出反应时,我都需要显示上下文菜单。有没有办法在不继承它的情况下做到这一点?
问问题
4877 次
4 回答
5
简单的方法,但可能不正是您需要的:
- 连接到 QTabWidget 的“currentChanged”信号
- 在连接到信号的插槽中,创建一个 QMenu 并根据需要填充它
- 最后,在连接到信号的槽中,调用 QMenu::exec( QCursor::pos() )
这将在选项卡更改(不一定单击)时调用一个函数,并在当前鼠标位置生成一个菜单。
复杂的方式,这正是你所描述的:
- 在您的 QTabWidget 上调用QObject::installEventFilter,以便您的 QTabWidget 上的所有事件都重定向到您自己的对象。
- 在您自己的对象中,重新实现QObject::customEvent并处理所有 QMouseEvent 事件。
- 根据需要填充 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 回答
1
根据@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));
}
于 2021-08-20T14:38:45.960 回答
0
我认为您需要创建自己的类,该类继承自 QTabWidget 并覆盖 MousePressEvent(QMouseEvent) 受保护的函数,您可以在其中右键单击创建上下文菜单。
于 2009-09-30T08:52:01.567 回答