Форум сайта python.su
Доброго времени суток, есть вот такой код :
from PyQt4 import QtCore, QtGui import sys class MyWidgetKomand(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.label = QtGui.QLabel("") self.box = QtGui.QVBoxLayout() self.box.addWidget(self.label) self.setLayout(self.box) class MyWindow(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.mdi_area = QtGui.QMdiArea() self.setCentralWidget(self.mdi_area) self.add_menu() def add_menu(self): self.menuStat = QtGui.QMenu("&Статистика") self.actKomand = QtGui.QAction("&Командировки", None) self.actKomand.triggered.connect(self.on_komand) self.menuStat.addAction(self.actKomand) self.menuBar().addMenu(self.menuStat) def on_komand(self): komand = MyWidgetKomand() subWindow = self.mdi_area.addSubWindow(komand) subWindow.setAttribute(QtCore.Qt.WA_DeleteOnClose) subWindow.resize(600, 250) subWindow.setWindowTitle("Командировки") subWindow.show() app = QtGui.QApplication(sys.argv) window = MyWindow() window.setWindowTitle("") window.resize(700, 350) window.show() sys.exit(app.exec_())
Офлайн
tiglonНужно сначала понять, насколько будет отличаться создание этих окон.
В меню будут и другие пункты.
def __init__(self, parent=None): self._opened_windows = {} ... def on_komand(self): key = "Командировки" subWindow = self._opened_windows.get(key) if subWindow: self.mdi_area.setActiveSubWindow(subWindow) return komand = MyWidgetKomand() subWindow = self._opened_windows[key] = self.mdi_area.addSubWindow(komand) subWindow.setWindowTitle(key) ...
import functools ... self.actKomand.triggered.connect(functools.partial(self.on_komand, "Командировки")) ... def on_komand(self, key): ...
class MyWidgetKomand(QtGui.QWidget): ... class MyWidgetAnotherKomand(QtGui.QWidget): ... self.actKomand.triggered.connect(functools.partial(self.on_komand, MyWidgetKomand)) self.actKomand2.triggered.connect(functools.partial(self.on_komand, MyWidgetAnotherKomand)) ... def on_komand(self, widget_type): subWindow = self._opened_windows.get(widget_type) ... komand = widget_type() ...
Офлайн
Спасибо за ответ,
да, виджеты должны быть разные. Например оба виджета это выгрузки из бд, первый с возможностью изменений значений а второй строиться на основании показателей из первого виджета.
Вариант с фабрикой мне кажется идеально подходит, но если я закрываю область, повторно при вызове из меню она не открывается (ошибка в self.mdi_area.setActiveSubWindow(subWindow) - workspace is empty)
from PyQt4 import QtCore, QtGui import sys from functools import partial class MyWidgetKomand(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.tname = "Командировки" self.label = QtGui.QLabel("") self.box = QtGui.QVBoxLayout() self.box.addWidget(self.label) self.setLayout(self.box) class MyWidgetBilling(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.tname = "Биллинг" self.label = QtGui.QLabel("") self.box = QtGui.QVBoxLayout() self.box.addWidget(self.label) self.setLayout(self.box) class MyWindow(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.mdi_area = QtGui.QMdiArea() self.setCentralWidget(self.mdi_area) self.add_menu() self._opened_windows = {} def add_menu(self): self.menuStat = QtGui.QMenu("&Первое меню") self.actKomand = QtGui.QAction("&Командировки", None) self.actKomand.triggered.connect(partial(self.on_window, MyWidgetKomand)) self.menuStat.addAction(self.actKomand) self.menuBar().addMenu(self.menuStat) self.menuStat1 = QtGui.QMenu("&Второе меню") self.actBilling = QtGui.QAction("&Биллинг", None) self.actBilling.triggered.connect(partial(self.on_window, MyWidgetBilling)) self.menuStat1.addAction(self.actBilling) self.menuBar().addMenu(self.menuStat1) def on_window(self, widget_type): subWindow = self._opened_windows.get(widget_type) if subWindow: self.mdi_area.setActiveSubWindow(subWindow) return widgetObject = widget_type() subWindow = self._opened_windows[widget_type] = self.mdi_area.addSubWindow(widgetObject) subWindow.resize(600, 250) #window.setAttribute(QtCore.Qt.WA_DeleteOnClose) subWindow.setWindowTitle(widgetObject.tname) subWindow.show() app = QtGui.QApplication(sys.argv) window = MyWindow() window.setWindowTitle("") window.resize(700, 350) window.show() sys.exit(app.exec_())
Офлайн
tiglon
Я так понимаю, нужно чтоб в момент закрытия окна (window.setAttribute(QtCore.Qt.WA_DeleteOnClose)) из self._opened_windows удалялся этот объект. Или как?)
subWindow = self._opened_windows.get(widget_type) if subWindow and subWindow in self.mdi_area.subWindowList(): ...
subWindow.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setWindowTitle("Командировки")
Отредактировано reclosedev (Фев. 11, 2013 14:14:11)
Офлайн
Спасибо.
Да, это я чёт извернулся
Отредактировано tiglon (Фев. 11, 2013 14:44:29)
Офлайн