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 回答
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 回答