X-Received: by 2002:a37:62cb:: with SMTP id w194mr6470181qkb.189.1633802056126; Sat, 09 Oct 2021 10:54:16 -0700 (PDT) X-Received: by 2002:a05:6808:57:: with SMTP id v23mr12806267oic.172.1633802055907; Sat, 09 Oct 2021 10:54:15 -0700 (PDT) Path: csiph.com!weretis.net!feeder6.news.weretis.net!news.misty.com!border2.nntp.dca1.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail Newsgroups: de.comp.lang.python Date: Sat, 9 Oct 2021 10:54:15 -0700 (PDT) In-Reply-To: <2489059.7TxBIyBedf@xrated> Injection-Info: google-groups.googlegroups.com; posting-host=2001:1711:fa54:36a0:746b:bbe0:6845:cd88; posting-account=BtTavwoAAACMi3AFrA3U-JBERbxGUGhD NNTP-Posting-Host: 2001:1711:fa54:36a0:746b:bbe0:6845:cd88 References: <22626993-ba87-4fb8-8a7d-b8c022a3e30en@googlegroups.com> <2024386.nlPfB5tcfk@xrated> <61d705ff-d5cc-4b08-bd26-af0af09a8a64n@googlegroups.com> <2489059.7TxBIyBedf@xrated> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <5fe0c3bb-3c6c-4b77-9392-4aedc5666e28n@googlegroups.com> Subject: Re: [Python-de] Re: New overriden and generated QLineEdit class will From: Mohsen Owzar Injection-Date: Sat, 09 Oct 2021 17:54:16 +0000 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Lines: 292 Xref: csiph.com de.comp.lang.python:5747 Hi Hans-Peter > okay, auf ein Neues. Zuvor ein kurzer Hinweis: ich vermute, Du hast noch = nicht=20 > so viel Erfahrung im Umgang mit Email in solchen Foren, und ich m=C3=B6ch= te Dir=20 > auch nicht vor den Kopf sto=C3=9Fen, aber im Prinzip tust Du es aber mit = Deinen=20 > Lesern.. Ohne jetzt gro=C3=9F und breit die Netiquette zu erkl=C3=A4ren, = hier ein=20 > Auszug: Zitieren durch Einr=C3=BCcken (mit "> " vor jeder Zeile =E2=80=93= und ohne=20 > Ver=C3=A4nderung des Wortlautes) und Weglassen =C3=BCberfl=C3=BCssiger In= formationen (Nicht=20 > immer alles zitieren!) Ja, da hast Du v=C3=B6llig Recht. Ich habe nicht so viel Erfahrung mit den = Foren. Mit dem Zitieren und das Code-Einf=C3=BCgen habe ich noch nicht ganz richti= g kapiert. Weil das Editieren auf dem Browser ziemlich nervt=C3=B6tend und umst=C3=A4n= dlich ist, schreibe ich zuerst meine Frage im Word, wo eine Schreib-Korrektur auch dab= ei ist. Und wenn ich mit dem Text fertig bin, mache ich wieder mit einem =C2=ABCUT = & PASTE=C2=BB den Text in den Browser-Editor hinein. Um Textpassagen zitieren zu k=C3=B6nnen, bringe ich die Passagen auch durch= =C2=ABCUT & PASTE=C2=BB aus dem Browser in Word und schreibe ich meinen Text noch dazu. Dabei f=C3=BCge ich am Anfang der zitierten Zeilen noch ein =C2=AB>=C2=BB h= inzu. Ich wusste nicht, dass man beim =C2=ABAllen Antworten=C2=BB in dem zitierte= n Text-Bereich auch editieren kann. Ich dachte, dass ich immer meine Sachen am Ende hinzuf= =C3=BCgen muss. Meinen Lesern wollte ich wirklich nicht vor den Kopf stossen. Man lernt nie aus!! > Jetzt kenne ich Deine Aufgabe und einige Ideen, wei=C3=9F ich aber immer = noch=20 > nicht, wo genau Dein Problem liegt? Vielleicht liegt es ja an mir. Ich bi= n ja=20 > schon ein ziemlich alter Knochen. Also hilf mir, Dein spezifischen Proble= m zu=20 > verstehen. So etwas wie: ich erwarte dieses Verhalten, bekomme aber jenes= =20 > Verhalten. Mein Problem ist ganz einfach. Jetzt wiederhole ich noch einmal Schritt f= =C3=BCr Schritt. Wenn ich mein Programm starte, muss in meinem Beispiel-Programm das Fenster= mit dem Namen: =C2=ABMainWindow namens Window1=C2=BB erscheinen, das sich darauf nur ein W= idget und zwar den frisierten QLineEdit oder besser gesagt die Klasse Custo= mLineEdit beherbergt. oder in meinem wirklichen Programm beim Start, zuerst das Haupt-Fenster (Ma= inWindow https://imgur.com/I1Fdf2f)) erscheint und man erst dann beim Klick= auf den Button =C2=ABSetting=C2=BB auf das Setting-Fenster (Settings-GUI: = https://imgur.com/Ot1OF4J) gelangt. An dieser Stelle haben wir jetzt die gleiche Situation im Beispiel-Code und= im wirklichen Code, mit einem Unterschied, dass im Beispiel-Code im =C2=AB= Window 1=C2=BB kein LineEdit-Feld zu sehen ist, wenn man die =C2=ABZeile 12= =C2=BB im Code auskommentiert. Und wenn man die =C2=ABZeile 12=C2=BB drin l= =C3=A4sst, erscheint dieses Edit-Feld beim Start des Beispiel-Codes darauss= en, was nicht korrekt ist. Wenn man dieses Verhalten auf meinen wirklichen Code =C3=BCbertragen w=C3= =BCrde, w=C3=BCrde es bedeuten, dass das Settings-Fenster gar keine Edit-Fe= lder hat, da sie sich ausserhalb des Settings-Fenster und auf derselben Ebe= ne befinden. Aber im wirklichen Code auf dem Settings-Fenster kannst Du alle QLineEdit-F= elder sehen. Hier sind sie noch normale und nicht =C3=BCberladene Widgets w= ie in meinem Beispiel-Code. Erst wenn mein Beispiel-Code funktioniert, werd= e ich dieses Verhalten auch auf das Settings-Fenster =C3=BCbertragen. > Du kannst Objekte in .show() und .hide() sichtbar machen und wieder=20 > verstecken. Das ist mir klar und die Show()-Methode habe ich auch auf Zeile 12 verwende= t. Diese Zeile d=C3=BCrfte dort =C3=BCberhaupt nicht da sein. Diese show()-Methode befindet sich auch auf "Zeile 49" und sollte daf=C3= =BCr sorgen, dass MainWindow (Window 1) erscheint mit einer instanziierten = =C3=BCberladenen QLineEdit-Klasse darauf. Starte bitte den Beispiel-Code und sieh, dass ein leeres "Window 1"-Fenster= erscheint. Und wenn man die Zeile 12 drin l=C3=A4sst, erscheint ein leeres Fenster mit= einem Edit-Feld parallel dazu auf derselben Ebene. Unten ist ein Teil Deiner ersten Antwort =C3=BCber Parent und die Initialis= ierng. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D > Okay, hier sagst du, du willst dein widget im mainWindow platzieren. > Das macht man =C3=BCblicherweise mit einer parent/child relationship. Da = du aber in > der Ableitung deiner Klasse diese *aller* Argumente beraubt hast, geht di= r > damit dieser Mechanismus (parent=3D..) verloren. Vielleicht nimmst Du mal= dein > __init__() ganz raus, dann solltest Du die default Signatur zur=C3=BCckbe= kommen, > und kannst parent auch wieder setzen.=20 An dieser Stelle sind meine Groschen nicht gefallen. Ich verstehe nicht die "Beraubung" "*aller*" Argumente und wie habe ich es = angestellt. Wie habe ich es beraubt und wie h=C3=A4tte ich es machen m=C3=BCssen? Das hat mit dem Problem zu tun, dass ich immer noch nicht die Verwendung vo= n Parent bei der Initialisierung von Klassen verstanden habe. Deine Beschreibung zu diesem Thema war wirklich gut. Solange ich aber keien= Beispiele sehe, tappe ich im Dunkel herum. Wenn Du zwei, drei kleine Code-beispiele h=C3=A4ttest, die zeigen, wie und = wo man Parent verwendet, bin Ich Dir Tausend Mal dankbar. Und hier versuche ich den Code mit den richtigen Einr=C3=BCckungen einzuf= =C3=BCgen: Nachdm ich gerade den Code eingef=C3=BCgt habe, sieht alles sehr gut aus.= =20 Die Einr=C3=BCckungen sind alle vorhanden. Ich weiss nicht, ob sie auch so bleiben, wenn ich auf die Schaltfl=C3=A4che= "Nachricht posten" dr=C3=BCcke. Hans-Peter, ich hoffe jetzt, dass Du ein bisschen mehr Information zu meine= m Problem hast, um mir weiterzuhelfen. Gruss Mohsen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% import sys from PyQt5.QtWidgets import (QApplication, QLineEdit, QPushButton, QMainWin= dow, QVBoxLayout, QHBoxLayout, QGridLayout, QWidget= ) from PyQt5.QtCore import pyqtSignal, pyqtSlot class CustomLineEdit(QLineEdit): clicked =3D pyqtSignal() def __init__(self): super().__init__() self.show() def mousePressEvent(self, QMouseEvent): self.clicked.emit() class MainWindow(QMainWindow): def __init__( self, parent=3DNone ): super().__init__(parent) self.title =3D 'Window 1' self.left =3D 700 self.top =3D 300 self.width =3D 200 self.height =3D 200 self.initUI() def initUI(self): self.keypad_window =3D Keypad_Window(self) hbox =3D QHBoxLayout() self.cle =3D CustomLineEdit() self.cle.clicked.connect(self.show_keypad_window) self.cle.setFixedSize(220, 60) self.cle.setStyleSheet("color: red;" "background-color: yellow;" "font-family: Arial;" "font-weight: Bold;" "font-size: 30pt") hbox.addWidget(self.cle) self.setLayout(hbox) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.show() def show_keypad_window(self): self.keypad_window.show() self.hide() def close(self): self.keypad_window.close() super(MainWindow, self).close() @pyqtSlot(str) def update_label(self, txt): self.cle.setText(txt) class Keypad_Window(QWidget): def __init__(self, parent=3DNone): super().__init__() self.parent =3D parent self.setGeometry(1200, 500, 230, 400) vbox =3D QVBoxLayout() self.display =3D QLineEdit() self.display.setFixedSize(220, 60) self.display.setReadOnly(True) self.display.setStyleSheet("color: Blue; " "background-color: lightgreen;" "font-family: Arial;" "font-weight: Bold;" "font-size: 18pt") vbox.addWidget(self.display) """Create the buttons.""" self.buttons =3D {} self.gridlay =3D QGridLayout() self.button_name =3D [['7', '8', '9'], ['4', '5', '6'], ['1', '2', '3'], ['C', '0', '>']] self.command_name =3D [['7', '8', '9'], ['4', '5', '6'], ['1', '2', '3'], ['delete', '0', 'accept']] for i in range(4): for j in range(3): text =3D self.button_name[i][j] # keep a reference to the buttons self.buttons[i, j] =3D QPushButton() self.buttons[i, j].setText(text) self.buttons[i, j].setObjectName(text) self.buttons[i, j].setFixedSize(70, 70) if i =3D=3D 3: if j =3D=3D 0: self.buttons[i, j].setToolTip('Each click deletes\n= a digit to the left') if j =3D=3D 2: self.buttons[i, j].setToolTip('The whole displayed\= nvalue will be taken!') self.buttons[i, j].clicked.connect(self.call_button_fun(i, = j, self.command_name)) # add to the GridLayout self.gridlay.addWidget(self.buttons[i, j], i, j) self.buttons[i, j].setStyleSheet("color: blue; " "background-color: cyan;" "font-family: Arial;" "font-weight: Bold;" "font-size: 20pt") vbox.addLayout(self.gridlay) self.setLayout(vbox) def call_button_fun(self, i, j, command_name): def button_fun(): if command_name[i][j] =3D=3D self.button_name[i][j]: displayed_text =3D self.display.text() self.new_text =3D displayed_text + self.button_name[i][j] self.display.setText(self.new_text) if command_name[i][j] =3D=3D 'accept': print('>-key pressed!') self.parent.cle.setText(self.new_text) self.close() if command_name[i][j] =3D=3D 'delete': print('C-key pressed!') self.display.setText('') return button_fun if __name__ =3D=3D "__main__": app =3D QApplication(sys.argv) mainwindow =3D MainWindow() # Exception abfangen, wenn sie nicht behandelt wurde sys._excepthook =3D sys.excepthook def exception_hook(exctype, value, traceback): print(exctype, value, traceback) sys._excepthook(exctype, value, traceback) sys.exit(1) sys.excepthook =3D exception_hook sys.exit(app.exec_())