Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне? [RSS Feed]

#1 Май 12, 2017 10:42:13

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?

На данный момент для открытия дочерних окон, которые работают отдельно от родителей, использую довольно сложную конструкцию, может есть возможность её упростить? Просто в родителе приходится прописывать те же “настройки”, что и в модуле.
Пример родителя:

     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. ДО полностью живёт своей жизнью, при закрытии родителя, ДО остаётся.
—————————–
Дополнение:
То, что я описываю, как выяснилось, это не дочернее окно.

Отредактировано Kyrym (Май 16, 2017 09:17:56)

Офлайн

#2 Май 12, 2017 11:11:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2683
Репутация: +  182  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Май 12, 2017 11:13:58)

Офлайн

#3 Май 12, 2017 11:30:56

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?

Rodegast
Опять 25…

Офлайн

#4 Май 12, 2017 13:01:00

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?

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

Отредактировано vic57 (Май 12, 2017 13:03:28)

Офлайн

#5 Май 12, 2017 13:31:40

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?

Ответа я не понял. Может я плохо сформулировал свой вопрос?
С Вашей ссылки:

С виджетами, эти отношения предок-потомок имеют дополнительный смысл: каждый потомок отображается внутри области экрана, занятой его предком. Это означает, что, когда удаляется окно, то все содержащиеся в нем виджеты также автоматически удаляются.
Мне нужно, чтобы подобное поведение отсутствовало.

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

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

Я пробовал через subprocces, но это там свои проблемы.

Офлайн

#6 Май 12, 2017 14:19:36

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?

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 (Май 12, 2017 14:24:29)

Офлайн

#7 Май 13, 2017 09:54:20

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?

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)

Офлайн

#8 Май 16, 2017 08:31:25

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?

В ходе экспериментов, выяснил, что прекрасно работает код (полноценная замена того, что я писал в первом посту):

 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, спасибо, Ваш код помог найти решение.

Отредактировано Kyrym (Май 16, 2017 08:56:05)

Офлайн

  • Начало
  • » GUI
  • » PyQt4 | Можно ли упростить конструкцию открытия программы в независимом окне?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version