Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5750

[Python-de] Re: New overriden and generated QLineEdit class will

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 | NextPrevious in thread | Next in thread | Find similar


Thread

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