Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #5750
| Path | csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail |
|---|---|
| From | Hans-Peter Jansen <hpj@urpla.net> |
| Newsgroups | de.comp.lang.python |
| Subject | [Python-de] Re: New overriden and generated QLineEdit class will |
| Date | Sun, 10 Oct 2021 18:39:45 +0200 |
| Lines | 231 |
| Message-ID | <7578517.K5ixYmkLR7@xrated> (permalink) |
| 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 <python-de.python.org> |
| Archived-At | <https://mail.python.org/archives/list/python-de@python.org/message/D5R6EJLCJWTJ5TOVODNHU5DEC2W6KAZD/> |
| List-Archive | <https://mail.python.org/archives/list/python-de@python.org/> |
| List-Help | <mailto:python-de-request@python.org?subject=help> |
| List-Owner | <mailto:python-de-owner@python.org> |
| List-Post | <mailto:python-de@python.org> |
| List-Subscribe | <mailto:python-de-join@python.org> |
| List-Unsubscribe | <mailto:python-de-leave@python.org> |
| Xref | csiph.com de.comp.lang.python:5750 |
Show key headers only | View raw
Am Samstag, 9. Oktober 2021, 19:54:15 CEST schrieb Mohsen Owzar:
>
> Mein Problem ist ganz einfach. Jetzt wiederhole ich noch einmal Schritt für
> Schritt. Wenn ich mein Programm starte, muss in meinem Beispiel-Programm
> das Fenster mit dem Namen: «MainWindow namens Window1» erscheinen, das 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 «Setting» 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 «Window 1» kein LineEdit-Feld zu
> sehen ist, wenn man die «Zeile 12» im Code auskommentiert. Und wenn man die
> «Zeile 12» drin lässt, erscheint dieses Edit-Feld beim Start des
> Beispiel-Codes daraussen, was nicht korrekt ist.
Eins nach dem anderen: talk with code
--8<--
import sys
from PyQt5.QtWidgets import (QApplication, QLineEdit, QPushButton, QMainWindow,
QVBoxLayout, QHBoxLayout, QGridLayout, QWidget)
from PyQt5.QtCore import pyqtSignal, pyqtSlot
class CustomLineEdit(QLineEdit):
clicked = pyqtSignal()
def mousePressEvent(self, QMouseEvent):
self.clicked.emit()
class MainWindow(QMainWindow):
def __init__( self, parent=None ):
super().__init__(parent)
self.title = 'Window 1'
self.left = 700
self.top = 300
self.width = 200
self.height = 200
self.initUI()
def initUI(self):
self.keypad_window = Keypad_Window(self)
central_widget = QWidget()
hbox = QHBoxLayout()
self.cle = 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=None):
super().__init__()
self.parent = parent
self.setGeometry(1200, 500, 230, 400)
vbox = QVBoxLayout()
self.display = 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 = {}
self.gridlay = QGridLayout()
self.button_name = [['7', '8', '9'],
['4', '5', '6'],
['1', '2', '3'],
['C', '0', '>']]
self.command_name = [['7', '8', '9'],
['4', '5', '6'],
['1', '2', '3'],
['delete', '0', 'accept']]
for i in range(4):
for j in range(3):
text = self.button_name[i][j]
# keep a reference to the buttons
self.buttons[i, j] = QPushButton()
self.buttons[i, j].setText(text)
self.buttons[i, j].setObjectName(text)
self.buttons[i, j].setFixedSize(70, 70)
if i == 3:
if j == 0:
self.buttons[i, j].setToolTip('Each click deletes\na digit to the left')
if j == 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] == self.button_name[i][j]:
displayed_text = self.display.text()
self.new_text = displayed_text + self.button_name[i][j]
self.display.setText(self.new_text)
if command_name[i][j] == 'accept':
print('>-key pressed!')
self.parent.cle.setText(self.new_text)
self.hide()
if command_name[i][j] == 'delete':
print('C-key pressed!')
self.display.setText('')
return button_fun
if __name__ == "__main__":
app = QApplication(sys.argv)
mainwindow = MainWindow()
# Exception abfangen, wenn sie nicht behandelt wurde
sys._excepthook = sys.excepthook
def exception_hook(exctype, value, traceback):
print(exctype, value, traceback)
sys._excepthook(exctype, value, traceback)
sys.exit(1)
sys.excepthook = exception_hook
sys.exit(app.exec_())
-->8--
Entspricht dies nun dem gewünschten Verhalten?
Hier eine Erklärung:
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 already has a layout
Du hättest einfach Dein CustomLineEdit als centralWidget setzen können.
Um Dir aber die Übernahme in Dein tatsächliches Projekt zu Erleichtern,
habe ich jetzt das line edit widget in ein container widget verfrachtet,
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
den event handler ankommt.
Solltest Du eine __init__ Methode brauchen, würde ich mich immer am
Original orientieren. Das würde dann so aussehen:
def __init__(self, parent = None), oder
def __init__(self, contents = "", parent = None)
Eine dynamische Argumentliste, die das C++-Verhalten nachbildet, ist auch
möglich, wird aber irgendwann kompliziert...
Ich will die parent Diskussion nicht zu sehr ausweiten. Im Prinzip machst
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
close Implementierung, damit das Schließen des main window auch ein
geöffnetes keypad widget schließt.
Dann habe ich noch die show/hide Logik (hoffentlich) ein bisschen
konsistenter gemacht.
Die richtige Initialisierung des keypad Wertes beim wiederholten Aufruf
überlasse ich Dir als Hausaufgabe..
Ich hoffe, das bringt Dich erst mal weiter.
Rechnung folgt. ;-)
Cheers,
Pete
Back to de.comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar
New overriden and generated QLineEdit class will not be placed on the MainWindow as expected Mohsen Owzar <mohsen.owzar@gmail.com> - 2021-10-08 02:14 -0700
[Python-de] Re: New overriden and generated QLineEdit class will not Lars Liedtke <liedtke@punkt.de> - 2021-10-08 12:20 +0200
[Python-de] Re: New overriden and generated QLineEdit class will not Hans-Peter Jansen <hpj@urpla.net> - 2021-10-08 18:02 +0200
Re: [Python-de] Re: New overriden and generated QLineEdit class will not Mohsen Owzar <mohsen.owzar@gmail.com> - 2021-10-08 21:10 -0700
[Python-de] Re: New overriden and generated QLineEdit class will Hans-Peter Jansen <hpj@urpla.net> - 2021-10-09 15:10 +0200
Re: [Python-de] Re: New overriden and generated QLineEdit class will Mohsen Owzar <mohsen.owzar@gmail.com> - 2021-10-09 10:54 -0700
Re: [Python-de] Re: New overriden and generated QLineEdit class will Mohsen Owzar <mohsen.owzar@gmail.com> - 2021-10-09 11:07 -0700
[Python-de] Re: New overriden and generated QLineEdit class will Marco Bakera <pintman@bakera.de> - 2021-10-10 09:23 +0200
[Python-de] Re: New overriden and generated QLineEdit class will Hans-Peter Jansen <hpj@urpla.net> - 2021-10-10 18:39 +0200
Re: [Python-de] Re: New overriden and generated QLineEdit class will Mohsen Owzar <mohsen.owzar@gmail.com> - 2021-10-10 13:36 -0700
[Python-de] Re: New overriden and generated QLineEdit class will Hans-Peter Jansen <hpj@urpla.net> - 2021-10-11 12:22 +0200
Re: [Python-de] Re: New overriden and generated QLineEdit class will Mohsen Owzar <mohsen.owzar@gmail.com> - 2021-10-11 04:47 -0700
csiph-web