Форум сайта python.su
На данный момент для открытия дочерних окон, которые работают отдельно от родителей, использую довольно сложную конструкцию, может есть возможность её упростить? Просто в родителе приходится прописывать те же “настройки”, что и в модуле.
Пример родителя:
def on_click_3_01(self): # функция открытия дочернего окна self.opn_frame_3_01 = QtGui.QFrame() import NAME_MOD self.opn_frame_3_01_lay = QtGui.QHBoxLayout(self.opn_frame_3_01) self.opn_frame_3_01_lay.addWidget(NAME_MOD.Window(self)) self.setLayout(self.opn_frame_3_01_lay) pal = self.opn_frame_3_01.palette() pal.setBrush(QtGui.QPalette.Window, QtGui.QBrush(QtGui.QColor(sss))) self.opn_frame_3_01.setPalette(pal) # передаёт изменённый цвет окну self.opn_frame_3_01.setWindowModality(0) self.opn_frame_3_01.move(40, 20) self.opn_frame_3_01.setMinimumSize(400, 600) self.opn_frame_3_01.setMaximumSize(1200, 1200) self.opn_frame_3_01.resize(800, 950) self.opn_frame_3_01.setWindowTitle('Заголовок') # Заголовок self.opn_frame_3_01.setWindowIcon(QtGui.QIcon('icon.png')) # Иконка self.opn_frame_3_01.show()
super().__init__(parent, QtCore.Qt.Window)
Отредактировано Kyrym (Май 16, 2017 09:17:56)
Офлайн
Отредактировано Rodegast (Май 12, 2017 11:13:58)
Офлайн
RodegastОпять 25…
Офлайн
Kyrymу вас путаница какая-то между parent->child и наследованием
Дочернее окно (ДО) имеет свойства:
1. ДО запускается отдельно от родителя, не перекрывая его.
2. Родитель доступен для работы после запуска ДО.
3. ДО полностью живёт своей жизнью, при закрытии родителя, ДО остаётся.
from PyQt4.QtGui import * a = QApplication([]) w = QWidget() l= QLabel("label") # l - независимый виджет, живет отдельно от w w.show() l.show() a.exec_()
from PyQt4.QtGui import * a = QApplication([]) w = QWidget() l= QLabel("label",w) #l- дочерний виджет, отображается внутри w, при закрытии w закрывается w.show() a.exec_()
Отредактировано vic57 (Май 12, 2017 13:03:28)
Офлайн
Ответа я не понял. Может я плохо сформулировал свой вопрос?
С Вашей ссылки:
С виджетами, эти отношения предок-потомок имеют дополнительный смысл: каждый потомок отображается внутри области экрана, занятой его предком. Это означает, что, когда удаляется окно, то все содержащиеся в нем виджеты также автоматически удаляются.Мне нужно, чтобы подобное поведение отсутствовало.
Офлайн
Kyrymтогда не нужно говорить - дочерний виджет. тут нет отношений parent->child
Мне нужно, чтобы подобное поведение отсутствовало.
from PyQt4.QtGui import * class W(QWidget): def __init__(self,parent=None): QWidget.__init__(self,parent) self.setObjectName("main widget") self.btn = QPushButton("Open") grid = QGridLayout(self) grid.addWidget(self.btn) self.btn.clicked.connect(openW1) def openW1(): global w1 w1 = W1() w1.move(0,0) w1.show() print 'object names:' for i in qApp.topLevelWidgets(): print i,i.objectName() class W1(QWidget): def __init__(self,parent=None): QWidget.__init__(self,parent) self.setObjectName("opened widget") self.lbl = QLabel("Label") grid = QGridLayout(self) grid.addWidget(self.lbl) if __name__ == "__main__": a = QApplication([]) w = W() w.move(100,100) w.show() a.exec_()
Отредактировано vic57 (Май 12, 2017 14:24:29)
Офлайн
Kyrymвот тут нужно наследование - создать прототип и наследуясь от него добавлять/изменять свойства и методы
Может есть способ делать это как-то проще?
from PyQt4.QtGui import * from PyQt4.QtCore import Qt #создаем класс-наследник от QLabel со своим цветом и текстом class Label(QLabel): def __init__(self,parent=None,color=Qt.white,text="Label"): QLabel.__init__(self,parent) pal = self.palette() pal.setColor(QPalette.Window, color) self.setPalette(pal) self.setText(text) if __name__ == "__main__": a = QApplication([]) l = Label() l.move(100,100) l1 = Label(None,Qt.red,"RED LABEL") l1.move(100,200) l.show() l1.show() a.exec_()
Отредактировано vic57 (Май 13, 2017 10:21:44)
Офлайн
В ходе экспериментов, выяснил, что прекрасно работает код (полноценная замена того, что я писал в первом посту):
def on_click_3_02(self): import NAME_MOD self.opn_3_02 = NAME_MOD.Window() self.opn_3_02.move(40,20) self.opn_3_02.show()
Отредактировано Kyrym (Май 16, 2017 08:56:05)
Офлайн