2016-01-15 32 views
0

Я разрабатываю простой текстовый редактор с mutlitabs. Я хочу реализовать меню rightclick для переименования нажата (не текущая) вкладка экземпляра QTabWidget. Для этого мне нужно найти индекс нажатой вкладки. Как я могу это сделать?Как найти индекс нажатой вкладки в QTabWidget в Python QT?

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): 
     ... 

ответ

1

Вы, вероятно, нужно проверить, щелкнул положение (т.е. 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, чтобы преобразовать положение данного события в собственные координаты табулатур. Надеюсь, я сделал все правильно.

+0

Спасибо, это сработало! – Fomalhaut

1

Вы можете добавить контекстное меню для виджетов 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) 

Хитрость здесь в том, что вы определяете лямбда для каждого TabBar на основе его индекса, что индекс будет передан в переименовать функцию. Для получения дополнительных сведений об управлении контекстными меню см. Страницу this.

Смежные вопросы