2016-03-29 4 views
2

私の問題の解決策を探しています。私は何をしましたか? QLineEditを継承したExtendedTruncateTextLineEditというサブクラスを書きました。私は何をしたいですか?さて、をQwidgetのQLineEditという名前で切り捨てて、ウィンドウのサイズを変更してQLineEditがコンテンツよりも小さくなってしまいます。次のコードは機能しますが、QLineEditウィジェットはQLabelのように見えます。次のコードは私のQLineEditも描画していますか?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

何です** ExtendedTruncateTextLabel **、誤っelidingになりますか? – Marcus

答えて

3

これはおそらくあなたが望むものの粗いバージョンです。私は約10分でこれを調理したので、非常に原油です。これはでこれはどこでも完全なの完全な場所であることに注意してください。まだいくつかのことが残っています。この場合、QLineEditがフォーカスを失ったときにテキストが省略されます。フォーカスが得られたら、テキストを復元する必要があります。その部分はまだ実装されていません。 QFontMentricsオブジェクトは、変更を取得しないためか、フォントの変更は、などなど...

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())) 
関連する問題