@__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
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.