如何在pythonqt中找到QTabWidget中单击选项卡的索引?

2024-10-02 00:41:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个简单的文本编辑器,它有多个标签。我想实现一个右键单击菜单来重命名QTabWidget实例的点击(不是当前的)选项卡。为此,我必须找到已单击选项卡的索引。我该怎么做?在

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyApplication(...):
    ...

    def contextMenuEvent(self, event):
        tabIndex = ... # <- what should I type here?

        menu = QMenu(self)

        renameAction = menu.addAction("Rename")

        action = menu.exec_(self.mapToGlobal(event.pos()))

        if action == renameAction:
            self.renameTabSlot(tabIndex)


    def renameTabSlot(self, tabIndex):
        ...

Tags: fromimportselfeventdefaction标签选项卡
2条回答

您可能需要根据选项卡区域手动检查单击位置(即event.pos ())。我的Python有点生锈,所以这里有一些C++代码代替。假设您的tabwidget名为myTabWidget

int tabIndex = -1;
{
  QTabBar* tabBar = myTabWidget->tabBar ();

  QPoint globalPos   = this  ->mapToGlobal   (event->pos ());
  QPoint posInTabBar = tabBar->mapFromGlobal (globalPos);

  for (int i=0; i<tabBar->count (); ++i)
  {
    if (tabBar->tabRect (i).contains (posInTabBar))
    {
      tabIndex = i;
      break;
    }
  }
}

if (tabIndex < 0)
{
  // No tab hit...
  return;
}

我没有编译并运行此程序,但其思想应该很清楚。注意mapToGlobalmapFromGlobal调用将给定事件的位置转换为选项卡栏的本机坐标。我希望我做得对。在

您可以通过以下代码向QTabBar小部件添加上下文菜单:

for i,tabbar in enumerate(bars):
    tabbar.setContextMenuPolicy(Qt.ActionsContextMenu)
    renameAction = QtGui.QAction("Rename",tabbar)
    renameAction.triggered.connect(lambda x: self.renameTabSlot(i))
    tabbar.addAction(renameAction)

这里的诀窍是根据每个选项卡的索引为每个选项卡定义一个lambda,以便将索引传递给rename函数。 有关处理上下文菜单的详细信息,请参见this页。在

相关问题 更多 >

    热门问题