ich habe folgendes Problem:
Ich bin derzeit an der Erstellung einer GUI und habe nun zwei Klassen, eine für ein Hauptfenster, in dem Parameter eingegeben werden und eine für ein Fenster, in dem anhand dieser Parameter eine Zeichnung erstellt wird.
Drücke ich auf einen Button "Vorschau" im Hauptfenster, so erstelle ich ein Klassenobjekt der "Zeichnungsfenster-Klasse", welche dann geöffnet wird und die Zeichnung anzeigt.
Nun sind Hauptfenster und Zeichnungsfenster geöffnet. Wenn ich im Hauptfenster jetzt den Wert einer Eingangsvariable verändere und mit Enter bestätige, muss ich zunächst erst auf das Zeichnungsfenster klicken, dass die Zeichnung aktualisiert wird.
Ich hätte es jedoch gern ohne den Klick aktualisiert. Ist das möglich?
In der Art "Enter löst Aktualisierung des Klassenobjektes aus".
Hier der Code:
Code: Alles auswählen
import sys
import PyQt5.QtCore as core
import PyQt5.QtWidgets as widgets
import PyQt5.QtGui as gui
import PyQt5.uic as uic
#import types
import math
import numpy as np
class MainWindow(widgets.QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("mainwindow.ui",self)
self.show()
self.comboBoxRotortopologie.addItems([" ", "Rotorkontur", "Sammelanordnung", "Doppel-I-Anordnung"])
self.pushButtonVorschau.clicked.connect(self.openPreviewWindow)
self.comboBoxRotortopologie.currentTextChanged.connect(self.setVariables)
self.d_si = 360
self.d_w = 160
self.p = 4
self.alpha_p = 0.8
self.k_pol = 0.8
self.delta = 1
self.varList_Allgemein = [["d_si",self.d_si],
["d_w",self.d_w],
["p",self.p],
["alpha_p",self.alpha_p],
["k_pol",self.k_pol],
["delta",self.delta]
]
self.lineEditList_Allgemein = []
def setVariables(self):
if self.comboBoxRotortopologie.currentText() == "Rotorkontur":
for entry in self.varList_Allgemein:
self.lineEditList_Allgemein.append(widgets.QLineEdit())
self.formLayoutVariables.addRow(entry[0], self.lineEditList_Allgemein[self.varList_Allgemein.index(entry)])
self.lineEditList_Allgemein[self.varList_Allgemein.index(entry)].setText(str(entry[1]))
self.lineEditList_Allgemein[self.varList_Allgemein.index(entry)].returnPressed.connect(self.getVariables)
def getVariables(self):
if self.comboBoxRotortopologie.currentText() == "Rotorkontur":
for entry in self.varList_Allgemein:
entry[1] = float(self.lineEditList_Allgemein[self.varList_Allgemein.index(entry)].text())
def openPreviewWindow(self):
previewWindow = PreviewWindow(self)
class PreviewWindow(widgets.QDialog):
def __init__(self, parent = None):
super().__init__(parent)
uic.loadUi("zeichnen.ui",self)
self.show()
self.parent = parent
def paintEvent(self, event):
parent = self.parent
width = self.widget.geometry().width()
height = self.widget.geometry().height()
painter = gui.QPainter()
painter.begin(self)
painter.translate(width/2,height/2)
painter.scale(1,-1)
for i in range (1, 2*parent.p+1):
for j in range (0,2):
self.drawOuterContour(painter,
parent.varList_Allgemein[2][1],
parent.varList_Allgemein[3][1],
parent.varList_Allgemein[0][1],
parent.varList_Allgemein[5][1],
parent.varList_Allgemein[4][1])
painter.scale(-1,1)
painter.rotate(i*45)
painter.end()
def drawOuterContour(self, painter, p, alpha_p, d_si, delta, k_pol):
sinusPoleEndAngle = math.pi/(2*p)*alpha_p
#Kontur
painter.drawPolyline(*self.sinusPole(p, alpha_p, d_si, delta, k_pol))
painter.drawPolyline(*self.circle(sinusPoleEndAngle, d_si, delta, k_pol, p)[0])
def sinusPole(self, p, alpha_p, d_si, delta, k_pol):
angleValues = np.linspace(0, math.pi/(2*p)*alpha_p, 1000)
points = []
for angle in angleValues:
points.append(core.QPointF(self.fx(angle, d_si, delta, k_pol, p), self.fy(angle, d_si, delta, k_pol, p)))
return points
def fx(self, angle, d_si, delta, k_pol, p):
return math.sin(angle)*((d_si-2*delta)/2-(k_pol*delta*(1/(math.cos(p*angle))-1)))
def fy(self, angle, d_si, delta, k_pol, p):
return math.cos(angle)*((d_si-2*delta)/2-(k_pol*delta*(1/(math.cos(p*angle))-1)))
def fxp(self, angle, d_si, delta, k_pol, p):
return math.cos(angle)*((d_si-2*delta)/2-(k_pol*delta*(1/(math.cos(p*angle))-1)))-(k_pol*delta*p*1/(math.cos(p*angle))*math.sin(angle)*math.tan(p*angle))
def fyp(self, angle, d_si, delta, k_pol, p):
return -math.sin(angle)*((d_si-2*delta)/2-(k_pol*delta*(1/(math.cos(p*angle))-1)))-(k_pol*delta*p*1/(math.cos(p*angle))*math.cos(angle)*math.tan(p*angle))
def circle(self, angle, d_si, delta, k_pol, p):
xm = ((self.fxp(angle, d_si, delta, k_pol, p)*self.fx(angle, d_si, delta, k_pol, p))+(self.fyp(angle, d_si, delta, k_pol, p)*self.fy(angle, d_si, delta, k_pol, p)))/(self.fxp(angle, d_si, delta, k_pol, p)+self.fyp(angle, d_si, delta, k_pol, p)*math.tan((90-(360/(4*p)))*((2*math.pi)/360)))
ym = math.tan((90-(360/(4*p)))*((2*math.pi)/360))*xm
r = math.sqrt(math.pow((abs(xm)-self.fx(angle, d_si, delta, k_pol, p)),2)+math.pow((abs(ym)-self.fy(angle, d_si, delta, k_pol, p)),2))
circleAngle = math.atan(math.fabs((math.tan((math.pi/2)-((math.pi/2)/p))-(-self.fxp(angle, d_si, delta, k_pol, p)/self.fyp(angle, d_si, delta, k_pol, p)))/(1+(math.tan((math.pi/2)-((math.pi/2)/p))*(-self.fxp(angle, d_si, delta, k_pol, p)/self.fyp(angle, d_si, delta, k_pol, p))))))*(360/(2*math.pi))
distance = math.sqrt(math.pow(xm,2)+math.pow(ym,2))-r
angleValues = np.linspace((3/2-1/8)*math.pi-math.radians(circleAngle), (3/2-1/8)*math.pi, 1000)
points = []
for angle in angleValues:
points.append(core.QPointF(xm+r*math.cos(angle), ym+r*math.sin(angle)))
return [points,distance]
def main():
app = widgets.QApplication(sys.argv)
mainWindow = MainWindow()
# previewWindow = PreviewWindow()
sys.exit(app.exec_()) # Ausfuehren der app
if __name__ == '__main__': # Direktes Ausfuehren
main()