代码之家  ›  专栏  ›  技术社区  ›  Fomalhaut

如何在Python QT中的QTabWidget中找到点击选项卡的索引?

  •  1
  • Fomalhaut  · 技术社区  · 9 年前

    我正在开发一个简单的文本编辑器,它有多个字符。我想实现一个右击菜单来重命名 单击(非当前) 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):
            ...
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   ThorngardSO    9 年前

    您可能需要检查点击的位置(即。 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;
    }
    

    我没有编译&运行这个,但想法应该很清楚。请注意 mapToGlobal mapFromGlobal 调用将给定事件的位置转换为选项卡栏的本地坐标。我希望我做得对。

        2
  •  1
  •   csunday95    9 年前

    您可以通过以下代码将上下文菜单添加到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 有关处理上下文菜单的更多信息,请参见。