如何在更改主要 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_())
编辑:当我改变主 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_())