如何在更改主要 window 大小时隐藏或剪切 Qwidget() 文本

How to hide or cut a Qwidget() text when I change main window size

编辑:当我改变主 window 大小时,我需要剪切 QStatusBar() 中包含的 QLabel() 的文本以适应表格的大小。如下图所示。

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
import sys

class MyMainWindow(QMainWindow): 

    def __init__(self):
        QMainWindow.__init__(self)

        self.setCentralWidget(QLabel("main widget"))

        statusBar = QStatusBar()
        self.setStatusBar(statusBar)

        statusBar.addWidget(QLabel("first message"))
        statusBar.addWidget(QLabel("second message"))
        statusBar.addWidget(QLabel("a thrid long long long long long message"))

app = QApplication(sys.argv)  
window = MyMainWindow()    
window.show()
sys.exit(app.exec_())

这样做的关键是在标签上设置适当的最小宽度,然后允许它们调整为小于其文本宽度的大小。但是,这只会裁剪右侧的文本,而不是将其删除(即 ... 出现在末尾)。

博客 post Status bar and elided label 解释了如何获取省略的文本,但解决方案是用 C++ 编写的。下面是用 PyQt4 编写的等效版本:

import sys
from PyQt4 import QtCore, QtGui

class ElidedLabel(QtGui.QLabel):
    _width = _text = _elided = None

    def __init__(self, text='', width=40, parent=None):
        super(ElidedLabel, self).__init__(text, parent)
        self.setMinimumWidth(width if width > 0 else 1)

    def elidedText(self):
        return self._elided or ''

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        self.drawFrame(painter)
        margin = self.margin()
        rect = self.contentsRect()
        rect.adjust(margin, margin, -margin, -margin)
        text = self.text()
        width = rect.width()
        if text != self._text or width != self._width:
            self._text = text
            self._width = width
            self._elided = self.fontMetrics().elidedText(
                text, QtCore.Qt.ElideRight, width)
        option = QtGui.QStyleOption()
        option.initFrom(self)
        self.style().drawItemText(
            painter, rect, self.alignment(), option.palette,
            self.isEnabled(), self._elided, self.foregroundRole())

class MyMainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow, self).__init__()

        self.setCentralWidget(QtGui.QLabel("main widget"))

        statusBar = QtGui.QStatusBar()
        self.setStatusBar(statusBar)

        statusBar.addWidget(ElidedLabel("first message"))
        statusBar.addWidget(ElidedLabel("second message"))
        statusBar.addWidget(ElidedLabel("a third long long long long long message"))

app = QtGui.QApplication(sys.argv)
window = MyMainWindow()
window.show()
sys.exit(app.exec_())