gmaksim
(возможно “костыль” в виде скрытого QLineEdit на форме?).
Зачем такие сложности?
У вас все классы это QWidget, Если в кратце то КуВиджет становиться окном только если не указан родительский виджет иначе он вписываеться в родителя. У вас есть несколько вариантов: Передавать родителя и использовать например QDialog или QMainWindow для дочерних окон. например так:
from PyQt4.QtGui import \
(QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget, QMainWindow, QDialog)
from PyQt4.QtCore import Qt
import sys
class one(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
# ...
self.start()
def start(self):
self.layout = QGridLayout()
self.setWindowTitle('One')
self.setLayout(self.layout)
self.setGeometry(20, 20, 100, 100)
# ...
self.show()
class two(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
# ...
self.start()
def start(self):
self.layout = QGridLayout()
self.setWindowTitle('Two')
self.setLayout(self.layout)
self.setGeometry(20, 20, 100, 100)
# ...
self.show()
def main():
app = QApplication(sys.argv)
def start1(parent):
s1 = one(parent)
def start2(parent):
s2 = two(parent)
root = QWidget()
root.layout = QGridLayout()
root.setLayout(root.layout)
root.setGeometry(100, 100, 600, 500)
# ...
root.butt = QPushButton(text='start 1')
root.butt.clicked.connect(lambda: start1(root))
root.layout.addWidget(root.butt, 1, 1)
root.butt = QPushButton(text='start 2')
root.butt.clicked.connect(lambda: start2(root))
root.layout.addWidget(root.butt, 2, 1)
root.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
или таки гдето хранить ссылку на обьект… пример
from PyQt4.QtGui import \
(QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget)
from PyQt4.QtCore import Qt
import sys
class one(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# ...
self.start()
def start(self):
self.layout = QGridLayout()
self.setWindowTitle('One')
self.setLayout(self.layout)
self.setGeometry(20, 20, 100, 100)
# ...
self.show()
class two(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# ...
self.start()
def start(self):
self.layout = QGridLayout()
self.setWindowTitle('Two')
self.setLayout(self.layout)
self.setGeometry(20, 20, 100, 100)
# ...
self.show()
def main():
app = QApplication(sys.argv)
def start1():
root.s1 = one()
def start2():
root.s2 = two()
root = QWidget()
root.layout = QGridLayout()
root.setLayout(root.layout)
root.setGeometry(100, 100, 600, 500)
# ...
root.butt = QPushButton(text='start 1')
root.butt.clicked.connect(start1)
root.layout.addWidget(root.butt, 1, 1)
root.butt = QPushButton(text='start 2')
root.butt.clicked.connect(start2)
root.layout.addWidget(root.butt, 2, 1)
root.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Можно даже держать ссылку на обьект внутри самого обьекта, тогда обьект будет держать сам себя. Като так:
from PyQt4.QtGui import \
(QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget)
from PyQt4.QtCore import Qt
import sys
class one(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# ...
self.w = self # Держим ссылку на самих себя чтобы окно не закрылось
self.start()
def start(self):
self.layout = QGridLayout()
self.setWindowTitle('One')
self.setLayout(self.layout)
self.setGeometry(20, 20, 100, 100)
# ...
self.show()
def closeEvent(self, event):
self.w = None # На всякий случай при закрытии удаляем ссылку, чтобы избежать утечек.
event.accept()
class two(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# ...
self.start()
def start(self):
self.layout = QGridLayout()
self.setWindowTitle('Two')
self.setLayout(self.layout)
self.setGeometry(20, 20, 100, 100)
# ...
self.show()
def main():
app = QApplication(sys.argv)
def start1():
s1 = one()
def start2():
s2 = two()
root = QWidget()
root.layout = QGridLayout()
root.setLayout(root.layout)
root.setGeometry(100, 100, 600, 500)
# ...
root.butt = QPushButton(text='start 1')
root.butt.clicked.connect(start1)
root.layout.addWidget(root.butt, 1, 1)
root.butt = QPushButton(text='start 2')
root.butt.clicked.connect(start2)
root.layout.addWidget(root.butt, 2, 1)
root.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Класс one сам себя “держит в памяти”, а класс two - нет
но тут нужно быть крайне осторожным, так как это может привести к “утечке памяти” когда окно не нужно и закрыто, а оно все еще занимает память.