Как мне получить доступ к переменным внешнего класса во внутреннем классе (PyQt)? - PullRequest
0 голосов
/ 28 января 2019

Это не дубликат!Я не хотел делать заголовок очень длинным, поэтому его короткая версия может показаться дубликатом.Проблема немного больше, чем в названии.

Среда: Я пытаюсь создать приложение для рисования, используя PyQt5 и Qt-Designer.В моем проекте есть три файла: main.py , slider.py , ui.py (пользовательский интерфейс из Qt-Designer, сгенерированный Pyuic).

Что мне нужно: Мне нужно изменить Приложение * Размер кисти (self.variable) каждый раз Ползунок значение изменяется.

Сама проблема: Класс приложения наследует класс Ui_MainWindow из файла, который я не могу редактировать (он генерируется каждый раз).Ui_MainWindow устанавливает класс слайдера в качестве своего атрибута.Так что в основном Slider является атрибутом приложения, и мне нужно изменить переменную приложения "canvas", находясь в классе Slider.

Я не знаю, как получить доступ к переменной внешнего класса в методе внутреннего класса.Особенно, когда я не могу редактировать ui.py, поэтому я мог бы вызвать Slider (self) вместо Slider (self.sidebar).

main.py

import sys
from PyQt5 import uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from ui import Ui_MainWindow


class App(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

if __name__ == '__main__':
    application = QApplication(sys.argv)
    example = App()
    example.show()
    sys.exit(application.exec_())

slider.py

from PyQt5 import uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from functools import partial
import inspect

class Slider(QSlider):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.valueChanged.connect(self.valueChange)
        self.setMinimum(8)
        self.setMaximum(64)
        self.setTickInterval(8)

    def valueChange(self):
        pass
        # Here I need to change App.canvas, have no idea how to do it

ui.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'main.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(912, 715)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.sidebar = QtWidgets.QWidget(self.centralwidget)
        self.sidebar.setMinimumSize(QtCore.QSize(388, 0))
        self.sidebar.setAutoFillBackground(True)
        self.sidebar.setObjectName("sidebar")
        self.clearButton = QtWidgets.QPushButton(self.sidebar)
        self.clearButton.setGeometry(QtCore.QRect(20, 30, 91, 41))
        self.clearButton.setObjectName("clearButton")
        # This is where Slider is called
        # The file is generated so I can't edit it
        self.brushSizeSlider = Slider(self.sidebar)
        # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        self.brushSizeSlider.setGeometry(QtCore.QRect(20, 120, 160, 22))
        self.brushSizeSlider.setOrientation(QtCore.Qt.Horizontal)
        self.brushSizeSlider.setObjectName("brushSizeSlider")
        self.brushSizeLabel = QtWidgets.QLabel(self.sidebar)
        self.brushSizeLabel.setGeometry(QtCore.QRect(20, 90, 101, 16))
        self.brushSizeLabel.setObjectName("brushSizeLabel")
        self.brushColorDial = QtWidgets.QDial(self.sidebar)
        self.brushColorDial.setGeometry(QtCore.QRect(20, 180, 50, 64))
        self.brushColorDial.setObjectName("brushColorDial")
        self.brushColorLabel = QtWidgets.QLabel(self.sidebar)
        self.brushColorLabel.setGeometry(QtCore.QRect(20, 160, 101, 16))
        self.brushColorLabel.setObjectName("brushColorLabel")
        self.horizontalLayout.addWidget(self.sidebar)
        self.canvas = Canvas(self.centralwidget)
        self.canvas.setMinimumSize(QtCore.QSize(500, 500))
        self.canvas.setMaximumSize(QtCore.QSize(5000, 5000))
        self.canvas.setBaseSize(QtCore.QSize(500, 500))
        self.canvas.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.canvas.setAutoFillBackground(True)
        self.canvas.setStyleSheet("canvas{background-color: rgb(70, 70, 50);}")
        self.canvas.setObjectName("canvas")
        self.horizontalLayout.addWidget(self.canvas)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.clearButton.setText(_translate("MainWindow", "Clear canvas"))
        self.brushSizeLabel.setText(_translate("MainWindow", "Current brush size:"))
        self.brushColorLabel.setText(_translate("MainWindow", "Current brush color:"))

from canvas import Canvas
from slider import Slider
...