2016-03-29 31 views
2

'daki bir metni nasıl kısaltabilirim Sorunuma bir çözüm arıyorum. Ne yaptım? QLineEdit öğesinden devralınan ExtendedTruncateTextLineEdit adlı bir alt sınıf yazdım. İstediğim? pencereyi yeniden boyutlandırmak ve QLineEdit içeriğinden daha küçülüyor olduğunda buldum bir QWidget bir metin kesmek istiyoruz QLineEdit adını verdi. Aşağıdaki kod çalışır, ancak QLineEdit-widget'ı bir QLabel gibi görünür. Ne yapmam gerekiyor, aşağıdaki kod QLineEdit'i de çekiyor mu?Python/PyQT: QLineEdit

import sys 
from PyQt4.QtCore import Qt 
from PyQt4.QtGui import QApplication,\ 
         QLineEdit,\ 
         QLabel,\ 
         QFontMetrics,\ 
         QHBoxLayout,\ 
         QVBoxLayout,\ 
         QWidget,\ 
         QIcon,\ 
         QPushButton,\ 
         QToolTip,\ 
         QBrush,\ 
         QColor,\ 
         QFont,\ 
         QPalette,\ 
         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("This is a really, long and poorly formatted runon sentence used to illustrate a point", 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("Dies ist ein normaler Text") 

     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): 

     """ Handle the paint event for the title bar. 

     This paint handler draws the title bar text and title buttons. 

     """ 
     super(ExtendedTruncateTextLineEdit, self).paintEvent(event) 
     painter = QPainter(self) 

     metrics = QFontMetrics(self.font()) 
     elided = metrics.elidedText(self.text(), Qt.ElideMiddle, self.width()) 

     painter.drawText(self.rect(), self.alignment(), elided) 

if __name__ == '__main__': 
    app = Example() 
    app.run() 
+0

nedir ** ExtendedTruncateTextLabel **, hatalı eliding sonuçlanır? – Marcus

cevap

3

Muhtemelen istediğiniz şeylerin kaba bir sürümü. Bunu yaklaşık 10 dakika içinde pişirdim, bu yüzden çok ham. Bu numaralı telefonun hiçbir şekilde'un tamamının yakınında olmadığını unutmayın. Hala yapılması gereken birkaç şey var. Bu durumda, QLineEdit odağı kaybettiğinde metin seçilir. Metin, odak kazandığında geri yüklenmelidir. Bu bölüm henüz uygulanmadı. QFontMentrics nesne, değişti etmemesi nedeniyle ya fontların değişikliği vs, vs ...

class ElidingLineEdit(QLineEdit) : 
    """Eliding text lineedit 
    """ 

    def __init__(self, text = QString(), parent = None) : 
     """Class initialiser 
     """ 

     QLineEdit.__init__(self, parent) 
     self.mText = text; 

     self.fm = QFontMetrics(self.font()) 

     self.textEdited[ QString ].connect(self.saveText) 
     self.editingFinished.connect(self.shortenText) 

    def setText(self, txt) : 
     """setText(QString) -> None 

     Override the QLineEdit::setText to display the shortened text 

     @return None 
     """ 

     QLineEdit.setText(self, self.fm.elidedText(self.mText, Qt.ElideRight, self.width())) 

    def resizeEvent(self, rEvent) : 
     """resizeEvent(QResizeEvent) -> None 

     Override the resizeevent to shorten the text 

     @return None 
     """ 

     QLineEdit.setText(self, self.fm.elidedText(self.mText, Qt.ElideRight, rEvent.size().width())) 

     rEvent.accept() 

    def saveText(self, newText) : 
     """saveText() -> None 

     Save the text as it is changing 

     @return None 
     """ 

     self.mText = newText 

    def shortenText(self) : 
     """saveText() -> None 

     Save the text as it is changing 

     @return None 
     """ 

     QLineEdit.setText(self, self.fm.elidedText(self.mText, Qt.ElideRight, self.width()))