Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Hans-Peter Jansen Newsgroups: de.comp.lang.python Subject: =?utf-8?q?=5BPython-de=5D_Re=3A_New_overriden_and_generated_QLineEdit_class_will?= Date: Sun, 10 Oct 2021 18:39:45 +0200 Lines: 231 Message-ID: <7578517.K5ixYmkLR7@xrated> References: <22626993-ba87-4fb8-8a7d-b8c022a3e30en@googlegroups.com> <2489059.7TxBIyBedf@xrated> <5fe0c3bb-3c6c-4b77-9392-4aedc5666e28n@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Trace: news.uni-berlin.de ISGXP7Kiwyi5ghLlDlYKHAUIxQXPuNhi1c4do76RFmqQ== Authentication-Results: mail.python.org; dkim=none reason="no signature"; dkim-adsp=none (unprotected policy); dkim-atps=neutral X-Virus-Scanned: amavisd at 'smile.earth' In-Reply-To: <5fe0c3bb-3c6c-4b77-9392-4aedc5666e28n@googlegroups.com> X-Provags-ID: V03:K1:tp++aJ5iUJOLZXUSEl7Cff+/J6PP+sHegk/GvQdCQ38tqnGq0jC +Pa5wKo8cmu4/whPdgoZfs8jzyp1nNTmM6h/q6MJ828NlaB6j+kiYqqI3dJwlcdKDpLW2fo PoHQ8eFrphvoMUtRGRYsUehKSiiTmX7h4N3bdbh5dFP4mBFMeHFkIkcqCeVBdF+x4W5D+r+ HSeZxyhXKAOqNvOJnPcnA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:8EpqdTUton8=:TQgeJxQtR22iKMZ/GkKYyI B3D6ZT1ufiEDX0v4dY+Lb/rzuRUJgD6svcCUfhkZqUphVtOmMBXmskeQu0p8EPs6iQfV+38aD S52vnaU0xcjpjfMb9rJKYtXE4iLn7ySOpZWSe95jg0TKgVE1oby0cJa7SISxTLGYwykKkByys R0dyYSbZob3OLmoeXX+AM2u8Q9kwjgdxSfExkmsT14fedBRSEtt/pL9l3tTbKMr8fofFsz5HO 63mlLpd+axsg4lXF47rrvCgp0prXlEMHyNg5wSGu1Gnlwem/7I5qSUdIwx8+k4/tyUEHccP0z Ts2jvSOeP6cvtbt+0zFNNdjZpSnWCIY8dGyxC7wQZRzDD/HvwItTuomPPKn8SuBQ5LaAxE/Ot cFOrru+gfNmScOpGOUYmbtriA9/zofwe6SCRanLjCkyLGyqw4BuwVh25LjGSxLnf+ZyzOaDj7 40C6OT1VFj5ShhcW3I+llmr7Y8bQ4nqZGUo1tyl6orZhDLGWw57AzejF/7uhP+4K8amdpDYP5 sNMSA5SYZpA14eg6HrGFjxo/5/ddRvEM1CTUVllJTBairMgTEQ2vyM2DUm8+zaBEfZB0ZlpWk 1RBAIl0/2FuGVnEWX4/Qx2TMMacyKlCpRwZQymT9ggdg8UAHRtkogxNnbg+B2LIcQ8lz98YcK nu7S8mSQUOjQsU7THceRZHMWBlMnABOKk0jHUyo9TQndtx4B11Iey807HToQJVy4gggu/4GsZ U11o/TI6vTo8bAr9OSneLQS4U56/xV+UDaxf/XXui2UlPbSCcorzzM6DYmi3Wuuz2KDpcAqA3 cp0PCq3 Message-ID-Hash: D5R6EJLCJWTJ5TOVODNHU5DEC2W6KAZD X-Message-ID-Hash: D5R6EJLCJWTJ5TOVODNHU5DEC2W6KAZD X-MailFrom: hpj@urpla.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-python-de.python.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.5 Precedence: list List-Id: Die Deutsche Python Mailingliste Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Xref: csiph.com de.comp.lang.python:5750 Am Samstag, 9. Oktober 2021, 19:54:15 CEST schrieb Mohsen Owzar: >=20 > Mein Problem ist ganz einfach. Jetzt wiederhole ich noch einmal Schritt f= =FCr > Schritt. Wenn ich mein Programm starte, muss in meinem Beispiel-Programm > das Fenster mit dem Namen: =ABMainWindow namens Window1=BB erscheinen, da= s sich > darauf nur ein Widget und zwar den frisierten QLineEdit oder besser gesagt > die Klasse CustomLineEdit beherbergt. oder in meinem wirklichen Programm > beim Start, zuerst das Haupt-Fenster (MainWindow > https://imgur.com/I1Fdf2f)) erscheint und man erst dann beim Klick auf den > Button =ABSetting=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 =ABWindow 1=BB kein LineEdit-Feld zu > sehen ist, wenn man die =ABZeile 12=BB im Code auskommentiert. Und wenn m= an die > =ABZeile 12=BB drin l=E4sst, erscheint dieses Edit-Feld beim Start des > Beispiel-Codes daraussen, was nicht korrekt ist.=20 Eins nach dem anderen: talk with code =2D-8<-- 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 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) central_widget =3D QWidget() 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) central_widget.setLayout(hbox) self.setCentralWidget(central_widget) 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() def closeEvent(self, event): self.keypad_window.close() super(MainWindow, self).closeEvent(event) @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.hide() 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_()) =2D->8-- Entspricht dies nun dem gew=FCnschten Verhalten? Hier eine Erkl=E4rung: QMainWindows sind speziell im Umgang mit Widgets: https://doc.qt.io/qt-5/qmainwindow.html#qt-main-window-framework Wenn Qt so was raus haut, dann sollte man dem auf den Grund gehen: QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which al= ready has a layout Du h=E4ttest einfach Dein CustomLineEdit als centralWidget setzen k=F6nnen. Um Dir aber die =DCbernahme in Dein tats=E4chliches Projekt zu Erleichtern,= =20 habe ich jetzt das line edit widget in ein container widget verfrachtet,=20 in dem Du wie gewohnt (mit eigenen Layouts) schalten und walten kannst. Den __init__ code im CustomLineEdit brauchst Du nicht, da es Dir nur auf=20 den event handler ankommt.=20 Solltest Du eine __init__ Methode brauchen, w=FCrde ich mich immer am=20 Original orientieren. Das w=FCrde dann so aussehen: def __init__(self, parent =3D None), oder=20 def __init__(self, contents =3D "", parent =3D None) Eine dynamische Argumentliste, die das C++-Verhalten nachbildet, ist auch=20 m=F6glich, wird aber irgendwann kompliziert... Ich will die parent Diskussion nicht zu sehr ausweiten. Im Prinzip machst=20 Du dies schon richtig im Keypad_Window, da dies hier ein Kind vom main window ist. Andererseits brauchst Du im main window sowieso eine andere=20 close Implementierung, damit das Schlie=DFen des main window auch ein=20 ge=F6ffnetes keypad widget schlie=DFt.=20 Dann habe ich noch die show/hide Logik (hoffentlich) ein bisschen=20 konsistenter gemacht.=20 Die richtige Initialisierung des keypad Wertes beim wiederholten Aufruf =FCberlasse ich Dir als Hausaufgabe.. Ich hoffe, das bringt Dich erst mal weiter. Rechnung folgt. ;-) Cheers, Pete