Найти - Пользователи
Полная версия: PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?
Начало » GUI » PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?
1
Kyrym
На данный момент для открытия дочерних окон, которые работают отдельно от родителей, использую довольно сложную конструкцию, может есть возможность её упростить? Просто в родителе приходится прописывать те же “настройки”, что и в модуле.
Пример родителя:
     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)

Дочернее окно (ДО) имеет свойства:
1. ДО запускается отдельно от родителя, не перекрывая его.
2. Родитель доступен для работы после запуска ДО.
3. ДО полностью живёт своей жизнью, при закрытии родителя, ДО остаётся.
—————————–
Дополнение:
То, что я описываю, как выяснилось, это не дочернее окно.
Rodegast
Kyrym
Rodegast
Опять 25…
vic57
Kyrym
Дочернее окно (ДО) имеет свойства:
1. ДО запускается отдельно от родителя, не перекрывая его.
2. Родитель доступен для работы после запуска ДО.
3. ДО полностью живёт своей жизнью, при закрытии родителя, ДО остаётся.
у вас путаница какая-то между parent->child и наследованием
 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_()
http://doc.crossplatform.ru/qt/4.4.3/widgets-tutorial.html
Kyrym
Ответа я не понял. Может я плохо сформулировал свой вопрос?
С Вашей ссылки:
С виджетами, эти отношения предок-потомок имеют дополнительный смысл: каждый потомок отображается внутри области экрана, занятой его предком. Это означает, что, когда удаляется окно, то все содержащиеся в нем виджеты также автоматически удаляются.
Мне нужно, чтобы подобное поведение отсутствовало.

Дополнение:
Из главного файла (родителя) я запускаю дочернее окно, в котором появляется модуль (другой питоновский файл).
Конструкция, что я представил - это рабочая функция, запускаемая по клику кнопки. Поведение функции меня устраивает полностью, однако, получается слишком большой код.

Из главного файла я собираюсь запускать несколько десятков программ, и для каждого модуля (файла) нужно писать такую портянку. Может есть способ делать это как-то проще?

Я пробовал через subprocces, но это там свои проблемы.
vic57
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_()
не совсем по теме, но пример хороший
https://evileg.com/ru/post/77/
vic57
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_()
Kyrym
В ходе экспериментов, выяснил, что прекрасно работает код (полноценная замена того, что я писал в первом посту):
 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()
где NAME_MOD - имя запускаемой программы.
Т.о. программа открывается со всеми своими свойствами, прописанными в файле NAME_MOD. Оказывается, всё очень просто.

vic57, спасибо, Ваш код помог найти решение.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB