Texte in den Widgets kürzen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem bei Überladung ist: du weißt nicht, was die Methode alles tut. Entscheidest aber “selbstherrlich” das du das original nicht aufrufen musst. Es kann aber sehr gut sein, das da etwa passiert, das zwingend notwendig für das funktionieren des Widgets ist.

Aus diesem Grund ist man von Überladung ehr weggekommen. Und ja, das ist kein Gesetz, und es gibt klar Fälle wo sie genutzt werden muss oder soll. Das hier ist keiner.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Vermutlich hast du Recht. Gerade weil ich mich noch als Anfänger zähle, sollte ich die Finger von den Re-Implementierungen lassen. Ich dachte nur, es wäre in Ordnung, da Siriu3 es auch so verfahren ist, dass setText()-Methoden der QLineEdit()-Klasse überschrieben wurde.

Mein nachfolgender Lösungsansatz wurde auf deine Kritik nochmals kräftig überarbeitet und es scheint wie gewünscht zu funktionieren. Der Benutzer schreibt seinen langen Text in die QLineEdit(). Während des Schreibens wird der Text nicht gekürzt. Verliert die QLineEdit() den Fokus, dann wird der Text gekürzt. Wenn der Benutzer das Fenster vergrößert, wird, soweit wie möglich, der originale Text angezeigt. Macht der Benutzer das Fenster sehr klein, so dass der Text wieder gekürzt wird und klickt dann in die QLineEdit(), so dass diese den Fokus erhält, dann wird der Text ungekürzt angezeigt. Ich hoffe, ich freue mich nicht zu früh 8)

Code: Alles auswählen

import sys
from PyQt4.QtCore import Qt, QEvent, QString
from PyQt4.QtGui import (QApplication, QLineEdit, QFontMetrics, QVBoxLayout,
                        QWidget, QPushButton)

class Example(QWidget):
    def __init__(self, elide = Qt.ElideMiddle,  parent = None):
        QWidget.__init__(self, parent)
        
        self.setMinimumWidth(80)

        self.font_metrics = QFontMetrics(self.font())

        self.saved_text = ""

        self._elide = elide

        self.init_ui()
        
    def init_ui(self):
        #   Create an instance of QLineEdit()
        self.line_edit_text = QLineEdit()
        self.line_edit_text.setPlaceholderText("Hell world I am here where you are")
        #   We must implement the eventFilter method
        #   and enable this property to the widgets that are needed with
        self.line_edit_text.installEventFilter(self)

        #   Create an instance of QPushButton()
        self.push_button = QPushButton("Just click me, nothing will happen.")
        self.push_button.installEventFilter(self)

        #   Add the both widgets to the layout, that is created.
        v_layout = QVBoxLayout()
        v_layout.addStretch(1)
        v_layout.addWidget(self.line_edit_text)
        v_layout.addWidget(self.push_button)
        self.setLayout(v_layout)

        #   Set a slot, connect() the textChanged-slot to the handle_text_change()-method.
        self.line_edit_text.textEdited[QString].connect(self.save_text)

    def eventFilter(self, obj, event):
        #   The eventFilter method has as information
        #   the object and type of event. So we have to
        #   listen to the focus events.
        if event.type() == QEvent.FocusIn:
            if obj == self.line_edit_text:
                self.line_edit_text.setText(self.saved_text)
                print "You clicked in the LineEdit"
        if event.type() == QEvent.FocusOut:
            if obj == self.line_edit_text:
                print "You lost focus"
                self.line_edit_text.setText(self.font_metrics.elidedText(self.saved_text, self._elide, self.width() -10))
        return super(QWidget, self).eventFilter(obj, event)

    def save_text(self, new_text):
        '''
            NOTICE:
            =======
            Implement the saveText()-method to save the text as it is changing.

            PARAMETERS:
            ===========
            :new_text   -   The given text have to save.

            :return     -   Nothing is returned. The statement 'return'
                            terminates a function. That makes sure that the
                            function is definitely finished.
        '''
        self.saved_text = new_text

        return

    def resizeEvent(self, rEvent):
        '''
            NOTICE:
            =======
            Override the resizeevent()-method of QLineEdit()-class to shorten the text.

            PARAMETERS:
            ===========
            :rEvent     -   The given QResizeEvent class contains event
                            parameters for resize events - for example accept()-method.

            :return     -   Nothing is returned. The statement 'return'
                            terminates a function. That makes sure that the
                            function is definitely finished.
        '''
        self.line_edit_text.setText(self.font_metrics.elidedText(self.saved_text, self._elide, rEvent.size().width() -10))

        rEvent.accept()

        return


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Example()
    window.show()
    sys.exit(app.exec_())
Nur habe ich ein kleines kosmetisches Problem. Wenn der Text in der Mitte gekürzt wird, dann wird der Text auf der linken Seiten nicht korrekt angezeigt.
Bild
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem verstehe ich nicht. Links oder rechts wird doch angeschnitten. Wenn du das nicht willst, musst du weiter kürzen?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@__deets__: Es wird doch in der Mitte gekürzt, richtig? Demzufolge dürfe links und rechts nichts passieren? Ich dachte zuerst daran links +10 zu schreiben:

Code: Alles auswählen

self.line_edit_text.setText(self.font_metrics.elidedText(+10, self.saved_text, self._elide, self.width() -10))
Aber das geht nicht:
Traceback (most recent call last):
File "C:\Users\Sophus\Desktop\kuerzung.py", line 192, in eventFilter
self.line_edit_text.setText(+10, self.font_metrics.elidedText(self.saved_text, self._elide, self.width() -10))
TypeError: QLineEdit.setText(QString): argument 1 has unexpected type 'int'
Antworten