<p>QLabel是一个非常简洁的小部件:它看起来非常简单,但实际上并非如此</p>
<p>大小和显示方面非常重要:因为它能够显示格式化文本,所以它甚至可以有一些<a href="https://doc.qt.io/qt-5/layout.html#layout-issues" rel="nofollow noreferrer">layout issues</a></p>
<P>因为您的要求是尽可能地保持标签(但是如果可能的话保持其内容显示),最重要的要求是实现^ {CD1>}(和^ {CD2>})函数,因为父控件的布局将在调整内容的大小时考虑。p>
<p>可能的解决方案基于两个方面:</p>
<ul>
<LI>提供一个基本的[最小]大小提示,不考虑整个内容</LI>
<li>当可用空间不足时,通过删除文本覆盖绘画</li>
</ul>
<P>下面的代码显然是<强>不/强>考虑富文本格式,包括不同的段落对齐、字包装等。</P>
<p>这是一个显示子类QLabel试图显示以下路径的示例:
<code>'/tmp/test_dir/some_long_path/some_subdir/imagepath/'</code></p>
<p><a href="https://i.stack.imgur.com/GrwKL.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/GrwKL.png" alt="screenshot of elided label"/></a></p>
<>考虑你甚至可以使用一个基本的QWIDGET。在下面的代码中,我正在考虑QFrame子类化功能,它还包括根据样式和<code>frameShape</code>或<code>frameShadow</code>属性添加适当的边距和边框</p>
<pre><code>class ElideLabel(QtWidgets.QLabel):
_elideMode = QtCore.Qt.ElideMiddle
def elideMode(self):
return self._elideMode
def setElideMode(self, mode):
if self._elideMode != mode and mode != QtCore.Qt.ElideNone:
self._elideMode = mode
self.updateGeometry()
def minimumSizeHint(self):
return self.sizeHint()
def sizeHint(self):
hint = self.fontMetrics().boundingRect(self.text()).size()
l, t, r, b = self.getContentsMargins()
margin = self.margin() * 2
return QtCore.QSize(
min(100, hint.width()) + l + r + margin,
min(self.fontMetrics().height(), hint.height()) + t + b + margin
)
def paintEvent(self, event):
qp = QtGui.QPainter(self)
opt = QtWidgets.QStyleOptionFrame()
self.initStyleOption(opt)
self.style().drawControl(
QtWidgets.QStyle.CE_ShapedFrame, opt, qp, self)
l, t, r, b = self.getContentsMargins()
margin = self.margin()
try:
# since Qt >= 5.11
m = self.fontMetrics().horizontalAdvance('x') / 2 - margin
except:
m = self.fontMetrics().width('x') / 2 - margin
r = self.contentsRect().adjusted(
margin + m, margin, -(margin + m), -margin)
qp.drawText(r, self.alignment(),
self.fontMetrics().elidedText(
self.text(), self.elideMode(), r.width()))
</code></pre>