X-Received: by 2002:a05:6214:627:: with SMTP id a7mr8456746qvx.13.1633752602900; Fri, 08 Oct 2021 21:10:02 -0700 (PDT) X-Received: by 2002:a05:6808:210e:: with SMTP id r14mr19266423oiw.3.1633752602570; Fri, 08 Oct 2021 21:10:02 -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: Fri, 8 Oct 2021 21:10:02 -0700 (PDT) In-Reply-To: <2024386.nlPfB5tcfk@xrated> Injection-Info: google-groups.googlegroups.com; posting-host=2001:1711:fa54:36a0:c459:2919:2bd:5bd; posting-account=BtTavwoAAACMi3AFrA3U-JBERbxGUGhD NNTP-Posting-Host: 2001:1711:fa54:36a0:c459:2919:2bd:5bd References: <22626993-ba87-4fb8-8a7d-b8c022a3e30en@googlegroups.com> <2024386.nlPfB5tcfk@xrated> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <61d705ff-d5cc-4b08-bd26-af0af09a8a64n@googlegroups.com> Subject: Re: [Python-de] Re: New overriden and generated QLineEdit class will not From: Mohsen Owzar Injection-Date: Sat, 09 Oct 2021 04:10:02 +0000 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Lines: 360 Xref: csiph.com de.comp.lang.python:5744 Hans-Peter Jansen schrieb am Freitag, 8. Oktober 2021 um 18:07:22 UTC+2: > Am Freitag, 8. Oktober 2021, 11:14:54 CEST schrieb Mohsen Owzar:=20 > > Hi all=20 > > I have a question about a clickable QLineEdit.=20 > > After searching some Hints, how to use QMouseEvent, I've written a prog= ram=20 > > which is working almost good but with a small or perhaps big ugliness a= nd=20 > > that is: Below is the imgur link to the screenshots of my program after= =20 > > clicking the buttons in sequence: https://imgur.com/a/rfcP3qB > Ich sch=C3=A4tze, wir k=C3=B6nnen an diesem Punkt in deutsch weitermachen= .=20 >=20 > Vielleicht solltest Du erst mal versuchen, dein Problem m=C3=B6glichst ku= rz zu=20 > formulieren. Ich kann hier nur eine Ablaufbeschreibung finden. > > As you will see in the code blow, > Ein whitespace damaged code ist ziemlich unbrauchbar, you know.. > > I override the QlineEdit widget and define=20 > > a new class " CustomLineEdit " to generate a "clicked" signal, when the= =20 > > user pressed with mouse on this field. I use this "CustomLineEdit" clas= s=20 > > and place it on the MainWindow with the desired "layout". I couldn't fi= gure=20 > > out, why this widget is placed not in the MainWindow, but outside this= =20 > > window, as you can see in the top picture of the attached screenshots. > Okay, hier sagst du, du willst dein widget im mainWindow platzieren.=20 >=20 > Das macht man =C3=BCblicherweise mit einer parent/child relationship. Da = du aber in=20 > der Ableitung deiner Klasse diese *aller* Argumente beraubt hast, geht di= r=20 > damit dieser Mechanismus (parent=3D..) verloren. Vielleicht nimmst Du mal= dein=20 > __init__() ganz raus, dann solltest Du die default Signatur zur=C3=BCckbe= kommen,=20 > und kannst parent auch wieder setzen. > > When=20 > > I take the line 12 (self.show()) from the code, the generated class wil= l=20 > > not appear. The problem here is that at the beginning, the MainWindow w= ith=20 > > a LineEdit field should appear at the program start. Then, after clicki= ng=20 > > on this field, the keypad should come up outside the MainWindow. > Hier widersprichst du dir. Aber ich glaube, ich habe dein Problem trotzde= m=20 > richtig interpretiert.=20 >=20 > Schau mal in die PyQt Beispiele, da solltest du alle Arten von subclassin= g,=20 > event handling, und so finden. Wichtig sind da noch die return codes aus = den=20 > event handlern..=20 >=20 > Gutes Gelingen.=20 >=20 > Cheers,=20 > Pete > > Could=20 > > anyone see, where my mistake is?=20 > > Thanks for any help.=20 > > Mohsen=20 > > Here is the code:=20 > > &&&&&&&&&&&&&&&&&&&&&&&&&&&=20 > > import sys=20 > > from PyQt5.QtWidgets import (QApplication, QLineEdit, QPushButton,=20 > > QMainWindow, QVBoxLayout, QHBoxLayout, QGridLayout, QWidget)=20 > > from PyQt5.QtCore import pyqtSignal, pyqtSlot=20 > >=20 > > class CustomLineEdit(QLineEdit):=20 > > clicked =3D pyqtSignal()=20 > >=20 > > def __init__(self):=20 > > super().__init__()=20 > >=20 > > self.show()=20 > >=20 > > def mousePressEvent(self, QMouseEvent):=20 > > self.clicked.emit()=20 > >=20 > >=20 > > class MainWindow(QMainWindow):=20 > > def __init__( self, parent=3DNone ):=20 > > super().__init__(parent)=20 > >=20 > > self.title =3D 'Window 1'=20 > > self.left =3D 700=20 > > self.top =3D 300=20 > > self.width =3D 200=20 > > self.height =3D 200=20 > > self.initUI()=20 > >=20 > > def initUI(self):=20 > >=20 > > self.keypad_window =3D Keypad_Window(self)=20 > >=20 > > hbox =3D QHBoxLayout()=20 > >=20 > > self.cle =3D CustomLineEdit()=20 > > self.cle.clicked.connect(self.show_keypad_window)=20 > > self.cle.setFixedSize(220, 60)=20 > > self.cle.setStyleSheet("color: red;"=20 > > "background-color: yellow;"=20 > > "font-family: Arial;"=20 > > "font-weight: Bold;"=20 > > "font-size: 30pt")=20 > >=20 > > hbox.addWidget(self.cle)=20 > > self.setLayout(hbox)=20 > >=20 > > self.setWindowTitle(self.title)=20 > > self.setGeometry(self.left, self.top, self.width, self.height)=20 > > self.show()=20 > >=20 > > def show_keypad_window(self):=20 > > self.keypad_window.show()=20 > > self.hide()=20 > >=20 > > def close(self):=20 > > self.keypad_window.close()=20 > > super(MainWindow, self).close()=20 > >=20 > > @pyqtSlot(str)=20 > > def update_label(self, txt):=20 > > self.cle.setText(txt)=20 > >=20 > > class Keypad_Window(QWidget):=20 > > def __init__(self, parent=3DNone):=20 > > super().__init__()=20 > > self.parent =3D parent=20 > >=20 > > self.setGeometry(1200, 500, 230, 400)=20 > >=20 > > vbox =3D QVBoxLayout()=20 > > self.display =3D QLineEdit()=20 > > self.display.setFixedSize(220, 60)=20 > > self.display.setReadOnly(True)=20 > > self.display.setStyleSheet("color: Blue; "=20 > > "background-color: lightgreen;"=20 > > "font-family: Arial;"=20 > > "font-weight: Bold;"=20 > > "font-size: 18pt")=20 > > vbox.addWidget(self.display)=20 > >=20 > > """Create the buttons."""=20 > > self.buttons =3D {}=20 > > self.gridlay =3D QGridLayout()=20 > >=20 > > self.button_name =3D [['7', '8', '9'],=20 > > ['4', '5', '6'],=20 > > ['1', '2', '3'],=20 > > ['C', '0', '>']]=20 > >=20 > > self.command_name =3D [['7', '8', '9'],=20 > > ['4', '5', '6'],=20 > > ['1', '2', '3'],=20 > > ['delete', '0', 'accept']]=20 > >=20 > > for i in range(4):=20 > > for j in range(3):=20 > > text =3D self.button_name[i][j]=20 > >=20 > > # keep a reference to the buttons=20 > > self.buttons[i, j] =3D QPushButton()=20 > > self.buttons[i, j].setText(text)=20 > > self.buttons[i, j].setObjectName(text)=20 > > self.buttons[i, j].setFixedSize(70, 70)=20 > > if i =3D=3D 3:=20 > > if j =3D=3D 0:=20 > > self.buttons[i, j].setToolTip('Each click deletes\na digit to the left'= )=20 > >=20 > > if j =3D=3D 2:=20 > > self.buttons[i, j].setToolTip('The whole displayed\nvalue will be taken= !')=20 > >=20 > > self.buttons[i, j].clicked.connect(self.call_button_fun(i, j,=20 > > self.command_name))=20 > >=20 > > # add to the GridLayout=20 > > self.gridlay.addWidget(self.buttons[i, j], i, j)=20 > > self.buttons[i, j].setStyleSheet("color: blue; "=20 > > "background-color: cyan;"=20 > > "font-family: Arial;"=20 > > "font-weight: Bold;"=20 > > "font-size: 20pt")=20 > > vbox.addLayout(self.gridlay)=20 > > self.setLayout(vbox)=20 > >=20 > > def call_button_fun(self, i, j, command_name):=20 > > def button_fun():=20 > > if command_name[i][j] =3D=3D self.button_name[i][j]:=20 > > displayed_text =3D self.display.text()=20 > > self.new_text =3D displayed_text + self.button_name[i][j]=20 > > self.display.setText(self.new_text)=20 > >=20 > > if command_name[i][j] =3D=3D 'accept':=20 > > print('>-key pressed!')=20 > > self.parent.cle.setText(self.new_text)=20 > > self.close()=20 > >=20 > > if command_name[i][j] =3D=3D 'delete':=20 > > print('C-key pressed!')=20 > > self.display.setText('')=20 > >=20 > > return button_fun=20 > >=20 > > if __name__ =3D=3D "__main__":=20 > > app =3D QApplication(sys.argv)=20 > > mainwindow =3D MainWindow()=20 > >=20 > > # Exception abfangen, wenn sie nicht behandelt wurde=20 > > sys._excepthook =3D sys.excepthook=20 > >=20 > > def exception_hook(exctype, value, traceback):=20 > > print(exctype, value, traceback)=20 > > sys._excepthook(exctype, value, traceback)=20 > > sys.exit(1)=20 > >=20 > > sys.excepthook =3D exception_hook=20 > >=20 > > sys.exit(app.exec_()) > > _______________________________________________=20 > > python-de Mailingliste -- pyth...@python.org=20 > > Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an=20 > > python-...@python.org=20 > > https://mail.python.org/mailman3/lists/python-de.python.org/ > > Mitgliedsadresse: h...@urpla.net Danke Hans-Peter f=C3=BCr Deine Antwort. Ich wurde auch von Lars benachrichtigt, dass ich auf der falschen Seite (De= utsch) meine Frage in Englisch gestellt habe. Damit ich nicht noch eine Frage aufmache, werde ich unten meine Frage noch = einmal auf Deutsch stellen. Aber zuerst zu Deinen Fragen: > Vielleicht solltest Du erst mal versuchen, dein Problem m=C3=B6glichst ku= rz zu=20 > formulieren. Ich kann hier nur eine Ablaufbeschreibung finden. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ich dachte, dass ich das getan h=C3=A4tte und dass ich zu viel geschrieben = habe. OK, wenn es so ist, ist nachfolgend eine kurze Beschreibung meines Pr= oblems: Ich muss eine GUI f=C3=BCr eine Relais-Test-Ablauf-Steuerung schreiben, die= in der Lage ist, durchs Bet=C3=A4tigen einiger =C2=ABButtons=C2=BB die Kon= takte zu schliessen oder zu =C3=B6ffnen. Man kann die Wartezeit f=C3=BCr di= e Schliess- / =C3=96ffnen-Zeit individuell f=C3=BCr jeden Test einstellen. = Daf=C3=BCr gibt es einen Button auf der Haupt-GUI (Settings), mit dessen Hi= lfe man auf das Settings-Fenster gelangt. Auf diesem Fenster befinden sich mehrere QLineEdit-Felder, die unter andere= m f=C3=BCr die einigen Zeit-Einstellungen zust=C3=A4ndig sind. Jetzt kommt mein Problem und Anliegen: Da am Ende, dieses Programms auf einem Raspberry Pi unter Linux laufen soll= und nur ein Tablet mit Touchscreen und kein Keyboard vorhanden ist, habe i= ch um jedes Edit-Feld einen Button =C2=ABPlus=C2=BB oder =C2=ABMinus=C2=BB = hinzugef=C3=BCgt, die den angezeigten Wert im Feld erh=C3=B6hen oder ernied= rigen. Wenn aber der gew=C3=BCnschte Wert sehr weit vom angezeigten Wert liegt, mu= ss man mehrere Male klicken, um den Endwert zu erreichen. Damit es schneller geht, habe ich mir gedacht, dass ich mit einem Klick in = dem Edit-Feld mit der Maus / Finger auf dem Tablet ein neues von mir geschr= iebenes Keypad-Objekt =C3=B6ffne, mit dessen Hilfe man den Endwert sofort e= intippt und mit OK diesen Wert in das Edit-Feld =C3=BCbernimmt. > Ein whitespace damaged code ist ziemlich unbrauchbar, you know %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Das habe ich nicht verstanden, was Du damit meinst. Vielleicht weil das Wort =C2=ABbelow=C2=BB falsch =C2=ABblow=C2=BB geschrie= ben wurde oder vielleicht weil ich den Code nicht direkt nach dieser Zeile,= sondern am Ende meiner Frage gebracht habe, war irgendwie nicht verst=C3= =A4ndlich. > Dein Vorschlag mit dem Wegnehmen von =C2=AB__init__()=C2=BB %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OK, das muss ich ausprobieren > Hier widersprichst du dir. Aber ich glaube, ich habe dein Problem trotzde= m richtig interpretiert. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ich glaube nicht. Damit es klar wird, werde ich den Link zu meinen eigentlichen GUIs-Screensh= ots auch hinzuf=C3=BCgen, um es besser verstehen zu k=C3=B6nnen. Screenshot von MainWindow-GUI: https://imgur.com/I1Fdf2f Screenshot von Settings-GUI: https://imgur.com/Ot1OF4J Wenn ich auf dem Settings-Fenster (in meinem Beispiel Window 1 oder MainWin= dow) bin, wo die ganzen QLineEdit-Felder vorhanden sind, sind alle Felder s= ichtbar. Man kann ihre Werte entweder mit =C2=AB+=C2=BB oder =C2=AB-=C2=BB = =C3=A4ndern oder mit einem Klick in das Feld das Keypad-Fenster (in meinem = Beispiel Keypad_Window) =C3=B6ffnen. Aber dieses Fenster muss erst dann erscheinen, wenn auf das Feld eingeklick= t wird. In meinem Beispiel-Code erscheint das =C2=ABWindow 1=C2=BB (die original GU= I Settings) ohne Edit-Feld > Schau mal in die PyQt Beispiele, da solltest du alle Arten von subclassin= g, event handling, und so finden. > Wichtig sind da noch die return codes aus den event handlern %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ja, ich habe die verschieden Versionen gesehen. Gerade deswegen bin ich ver= wirrt. Ich weiss nicht, wann ich die =C2=AB__init__()=C2=BB und =C2=ABsuper()=C2= =BB Zeilen so leer lasse und wann bringe ich in =C2=AB__init__=C2=BB das Ar= gument =C2=ABparent=3DNone=C2=BB und =C2=ABparent=C2=BB in =C2=ABSuper().__= init__(parent)=C2=BB. In verschiedenen Beispiele sind manchmal die eine Version in den anderen di= e andere Version oder sogar manchmal eine Kombination der beiden. Ich konnte daraus nicht schlau werden. Nirgendwo habe ich eine einfache kla= re Dokumentation bei meinen Google-Searches zu diesem Thema gefunden. Wie Du z. B. in Deinem Vorschlag erw=C3=A4hnt hast, warum soll ich den "ini= t"-Part wegnehmen. Was hat das zur Folge, wenn es dadrin ist? Daher meine Frage, ob jemand mir wirklich erkl=C3=A4ren kann, wann ich die = Argument-Felder leer lasse und wann ich sie bef=C3=BCllen muss. Ich hoffe, dass mit oben gesagten / geschriebenen Du mein Problem besser ve= rstehst und vielleicht mir eine Ausweg zeigst. Gruss Mohsen &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Und nun meine Frage in Deutsch wiederholt: Den Code werde ich nicht noch einmal hinzuf=C3=BCgen, da er von der ersten = englischen Frage enztnommen werden kann. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Hallo zusammen Ich habe eine Frage zu einem anklickbaren QLineEdit. Nachdem ich einige Hinweise zur Verwendung von QMouseEvent gesucht habe, ha= be ich ein Programm geschrieben, das fast gut funktioniert, aber mit einer = kleinen oder vielleicht gro=C3=9Fen H=C3=A4sslichkeit und das ist: Unten ist der imgur-Link zu den Screenshots meines Programms, nachdem Sie n= acheinander auf die Schaltfl=C3=A4chen geklickt haben: https://imgur.com/a/rfcP3qB Wie Sie im angeh=C3=A4ngten Code unten sehen, =C3=BCberschreibe ich das Qli= neEdit-Widget und definiere eine neue Klasse " CustomLineEdit ", um ein "ge= klicktes" Signal zu erzeugen, wenn der Benutzer mit der Maus auf dieses Fel= d dr=C3=BCckt. Ich benutze diese "CustomLineEdit" Klasse und platziere sie auf dem MainWin= dow mit dem gew=C3=BCnschten "Layout". Ich konnte nicht herausfinden, warum dieses Widget nicht im MainWindow, son= dern au=C3=9Ferhalb dieses Fensters platziert wird, wie Sie im oberen Bild = der beigef=C3=BCgten Screenshots sehen k=C3=B6nnen. Damit ich =C3=BCberhaupt dieses QLineEdit-Feld sehe, musste ich die Zeile 1= 2 (self.show()) im Code hinzuf=C3=BCgen. Wenn ich die Zeile 12 aus dem Code nehme, wird die generierte Klasse nicht = angezeigt. Das Problem hierbei ist, dass am Anfang das MainWindow mit einem LineEdit-F= eld beim Programmstart erscheinen sollte. Nachdem Sie auf dieses Feld geklickt haben, sollte die Tastatur au=C3=9Ferh= alb des MainWindow erscheinen. K=C3=B6nnte jemand sehen, wo mein Fehler liegt? Danke f=C3=BCr jede Hilfe. Mohsen