среда, 28 сентября 2011 г.

Тюнинг вкладок QMdiArea

Главное окно проекта должно быть многодокументным и в соответствии с современным стандартом де-факто хочется отображать дочерние окна на отдельных вкладках. Для этого в качестве центрального виджета главного окна нужно использовать QMdiArea и установить режим отображения TabbedView

from PyQt4.QtGui import QMainWindow, QMdiArea

class MainWnd(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setCentralWidget(QMdiArea(self))
        self.centralWidget().setViewMode(QMdiArea.TabbedView)

Все бы хорошо, но добавив одну-две вкладки начинаешь понимать, что вещь из коробки снова придется допиливать напильником:


Здесь меня не удовлетворяют два момента:
  1. Я привык, когда ширина вкладки подгоняется под ее заголовок;
  2. Люблю кнопки закрытия на каждой вкладке.
Значит будем пилить. Решение первой задачи отыскалось довольно быстро: у центрального виджета отыскать все дочерние виджеты QTabBar и снять у них флажок Expanding (forum.crossplatform.ru). Добавим в конец конструктора окна код:

for tab in self.centralWidget().findChildren(QTabBar):
    tab.setExpanding(False)

Результат вполне удовлетворительный:



Со второй проблемой пришлось повозиться дольше. Спасибо, коллеги подбросили ссылочку.
Переводить на русский и разбирать по костям не буду, вроде бы все очевидно (если нет, милости просим в комменты), приведу только итоговый код на PyQt:

from PyQt4.QtGui import QMainWindow, QMdiArea, QTabBar

class MainWnd(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setCentralWidget(QMdiArea(self))
        self.centralWidget().setViewMode(QMdiArea.TabbedView)
        for tab in self.centralWidget().findChildren(QTabBar):
            tab.setExpanding(False)
            tab.setTabsClosable(True)
            tab.tabCloseRequested.connect(self.closeTab)

    def closeTab(self, index):
        sub = self.centralWidget().subWindowList()[index]
        self.centralWidget().setActiveSubWindow(sub)
        self.centralWidget().closeActiveSubWindow()


Вот теперь именно то, что и хотелось. Более того, оно правильно работает :)


Комментариев нет:

Отправить комментарий