Попытался сделать что то на подобие композиции не вышло, почему не работает код?
Попытался сделать что-то на подобие композиции, не вышло. Почему не работает код и что нужно сделать чтобы он заработал? Ещё новичок в этом и хочу разобраться.
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QFileDialog, QMessageBox
from PyQt5.QtWidgets import *
class Widget(QtWidgets.QWidget):
def __init__(self, val):
super().__init__()
self.textEdit = QtWidgets.QTextEdit(f'{val}' * 10, self)
v_layout = QtWidgets.QVBoxLayout(self)
v_layout.addWidget(self.textEdit)
class App(QtWidgets.QWidget):
def __init__(self):
super().__init__()
def create_file(self):
self.tab = Widget(self.val)
self.tab.setObjectName("tab")
self.tabWidget.addTab(self.tab, "")
str = f"NEW {self.val}"
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), str)
self.val += 1
def close_tab(self, ind):
self.tabWidget.removeTab(ind)
class Ui_MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.app = App()
self.tabWidget.setTabsClosable(True)
self.tabWidget.tabCloseRequested.connect(self.app.close_tab)
self.action_2.triggered.connect(self.app.create_file)
self.val = 0
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(381, 265)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(10, 10, 361, 201))
self.tabWidget.setObjectName("tabWidget")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 381, 21))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.action = QtWidgets.QAction(MainWindow)
self.action.setObjectName("action")
self.action_2 = QtWidgets.QAction(MainWindow)
self.action_2.setObjectName("action_2")
self.menu.addAction(self.action)
self.menu.addAction(self.action_2)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.show()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "Файл"))
self.action.setText(_translate("MainWindow", "Сохранить"))
self.action_2.setText(_translate("MainWindow", "Новый файл"))
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = Ui_MainWindow()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
я не вникал в логику того, что вы сделали, а просто внес изменения чтобы не было ошибок. Если это подобие на композицию, пускай будет так.
Обратите внимание:
self.app = App(self) # + self
и
def __init__(self, parent): # + parent
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QFileDialog, QMessageBox
from PyQt5.QtWidgets import *
class Widget(QtWidgets.QWidget):
def __init__(self, val):
super().__init__()
self.textEdit = QtWidgets.QTextEdit(f'{val}' * 10, self)
v_layout = QtWidgets.QVBoxLayout(self)
v_layout.addWidget(self.textEdit)
class App(QtWidgets.QWidget):
def __init__(self, parent): # + parent
super().__init__()
self.parent = parent # +
def create_file(self):
self.tab = Widget(self.parent.val) # self.parent
self.tab.setObjectName("tab")
self.parent.tabWidget.addTab(self.tab, "") # self.parent
_str = f"NEW {self.parent.val}" # self.parent
self.parent.tabWidget.setTabText(self.parent.tabWidget.indexOf(self.tab), _str) # self.parent
self.parent.val += 1 # self.parent
def close_tab(self, ind):
self.parent.tabWidget.removeTab(ind)
class Ui_MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.val = 0 # +
self.app = App(self) # + self
self.tabWidget.setTabsClosable(True)
self.tabWidget.tabCloseRequested.connect(self.app.close_tab)
self.action_2.triggered.connect(self.app.create_file)
# self.val = 0 # -
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(381, 265)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(10, 10, 361, 201))
self.tabWidget.setObjectName("tabWidget")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 381, 21))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.action = QtWidgets.QAction(MainWindow)
self.action.setObjectName("action")
self.action_2 = QtWidgets.QAction(MainWindow)
self.action_2.setObjectName("action_2")
self.menu.addAction(self.action)
self.menu.addAction(self.action_2)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.show()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "Файл"))
self.action.setText(_translate("MainWindow", "Сохранить"))
self.action_2.setText(_translate("MainWindow", "Новый файл"))
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = Ui_MainWindow()
sys.exit(app.exec_())
