Открыть новое окно не закрывая старого
Есть таблица QTableWidget в основном окне и класс с новым окном QWidget.
Как сделать так, чтобы при нажатии на ячейку, открывалось новое окно, но старое не закрывалось?
То есть тыкаем на первую ячейку открывается окно, тыкаем на вторую теперь открыто два дочерних окна QWidget.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QDialog, QVBoxLayout, QLabel, \
QWidget
class NewWindow(QWidget):
def __init__(self, cell_text):
super().__init__()
self.setWindowTitle("New Window")
layout = QVBoxLayout()
self.label = QLabel(f"Cell Text: {cell_text}")
layout.addWidget(self.label)
self.setLayout(layout)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Main Window")
self.setGeometry(100, 100, 400, 300)
self.table_widget = QTableWidget(self)
self.setCentralWidget(self.table_widget)
# Заполняем таблицу
self.table_widget.setRowCount(3)
self.table_widget.setColumnCount(3)
for i in range(3):
for j in range(3):
self.table_widget.setItem(i, j, QTableWidgetItem(f"Item {i},{j}"))
# Подключаем сигнал клика по ячейке
self.table_widget.cellClicked.connect(self.open_new_window)
def open_new_window(self, row, column):
# Получаем текст ячейки
cell_text = self.table_widget.item(row, column).text()
# Создаем и показываем новое окно
self.new_window = NewWindow(cell_text)
self.new_window.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: user753715
→ Ссылка
оказывается просто нужно сохранять в список ссылки на созданные объекты.
self.win_list = []
...
self.new_window = NewWindow(cell_text)
self.win_list.append(self.new_window)
self.new_window.show()
Автор решения: S. Nick
→ Ссылка
Сохранение в список вам не совсем подходит, т.к. при нажатии на одну и туже ячейку несколько раз у вас откроется новых окон столько же раз. Вам лучше подойдет словарь.
Также упорядочил расположение новых окон и автоматическое их закрытие при закрытии основного окна. Попробуйте.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, \
QTableWidget, QTableWidgetItem, QDialog, QVBoxLayout, \
QLabel, QWidget
from PyQt5.QtCore import Qt
class NewWindow(QWidget):
def __init__(self, cell_text):
super().__init__()
self.setWindowTitle("New Window")
layout = QVBoxLayout(self)
self.label = QLabel(f"Cell Text: {cell_text}")
layout.addWidget(self.label)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Main Window")
self.resize(400, 300)
# +++
self.my_dict = {} # +++
self.table_widget = QTableWidget(self)
self.setCentralWidget(self.table_widget)
# Заполняем таблицу
self.table_widget.setRowCount(3)
self.table_widget.setColumnCount(3)
for i in range(3):
for j in range(3):
self.table_widget.setItem(
i, j, QTableWidgetItem(f"Item {i},{j}"))
# +++
self.my_dict[i, j] = None # +++
# Подключаем сигнал клика по ячейке
self.table_widget.cellClicked.connect(self.open_new_window)
def open_new_window(self, row, column):
# Получаем текст ячейки
cell_text = self.table_widget.item(row, column).text()
# Создаем и показываем новое окно
# self.new_window = NewWindow(cell_text)
new_window = NewWindow(cell_text)
# self.win_list.append(self.new_window)
self.my_dict[row, column] = new_window
# self.new_window.show()
self.my_dict[row, column].show()
# +++
self.my_dict[row, column].setGeometry(
150*column+111, 130*row+111, 120, 80) # +++
def closeEvent(self, event): # +++
for value in self.my_dict.values():
# print(f" Значение: {value}")
if value:
value.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec())
