im diesem lauffähigen Quelltext bzw. Programm geht es darum, dass bestimmte Texte (hier in diesem Beispiel) im QLabel und QLineEdit gekürzt werden soll, sobald das Fenster zu sehr verkleinert wird. Dieses Phänomen begegnet uns häufig dort, wenn der Pfad zu lang ist, wird dieser entweder in der Mitte oder am Ende gekürzt, damit der Inhalt weiterhin im Blick bleibt und nicht "verschwindet".
Was habe ich getan? Ich habe sowohl für QLabel als auch für QLineEdit jeweils eine Subclass geschrieben, um die Klassen der jeweiligen Widgets zu überschreiben. Das Kürzen der Texte klappt auch soweit. Allerdings habe ich beim QLineEdit ein kleines Problem. Sobald ich diese Anwendung starte, sieht mein QLineEdit aus wie ein Label und nicht eben wie ein QLineEdit. Was genau habe ich hier übersehen?
Code: Alles auswählen
import sys
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QApplication,\
QLineEdit,\
QLabel,\
QFontMetrics,\
QHBoxLayout,\
QVBoxLayout,\
QWidget,\
QIcon,\
QPushButton,\
QToolTip,\
QBrush,\
QColor,\
QFont,\
QPainter
qt_app = QApplication(sys.argv)
class Example(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setMinimumWidth(100)
self.init_ui()
def init_ui(self):
v_layout = QVBoxLayout()
v_layout.addStretch(1)
lbl = ExtendedTruncateTextLabel(self)
lbl.setText("This is a really, long and poorly formatted runon sentence used to illustrate a point.")
lbl_1 = ExtendedTruncateTextLabel(self)
lbl_1.setText("Here you also see a long text, but isn't important.")
l_text = ExtendedTruncateTextLineEdit()
l_text.setText("In the widget namend QLineEdit is also a very long text.")
v_layout.addWidget(lbl)
v_layout.addWidget(lbl_1)
v_layout.addWidget(l_text)
self.setLayout(v_layout)
def run(self):
self.show()
qt_app.exec_()
class ExtendedTruncateTextLineEdit(QLineEdit):
def __init(self, parent):
QLineEdit.__init__(self, parent)
def paintEvent(self, event):
painter = QPainter(self)
metrics = QFontMetrics(self.font())
elided = metrics.elidedText(self.text(), Qt.ElideMiddle, self.width())
painter.begin(self)
painter.drawText(self.rect(), self.alignment(), elided)
painter.end()
class ExtendedTruncateTextLabel(QLabel):
def __init(self, parent):
QLabel.__init__(self, parent)
def paintEvent(self, event):
painter = QPainter(self)
metrics = QFontMetrics(self.font())
elided = metrics.elidedText(self.text(), Qt.ElideMiddle, self.width())
painter.begin(self)
painter.drawText(self.rect(), self.alignment(), elided)
painter.end()
if __name__ == '__main__':
app = Example()
app.run()