我试图使Qlabel看起来像信使中的现代聊天泡泡(圆形矩形,三角形尖端),如下图所示:
我设法使qlabel有一个锋利的边缘,但不知道如何使尖端。问题是在拐角处插入一条三角形路径,qlabel round rect和文本应该朝相反的方向移动,但是这样做会导致文本超出标签区域
这是一个子类标签,它覆盖了paint事件和resize事件(在word wrapping中使用的resize可能超出了我的问题范围)>;我删除了一些与颜色、字体等相关的不必要的代码
class chatLabel(QtWidgets.QLabel):
def __init__(self,text):
super(chatLabel, self).__init__(text)
self.setContentsMargins(6,6,6,6)
sizePolicy = QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Expanding )
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
self.setSizePolicy(sizePolicy)
self.color = QtGui.QColor("#333C43")
def paintEvent(self, e):
p = QtGui.QPainter(self)
p.setRenderHint(QtGui.QPainter.Antialiasing, False)
rect = QtCore.QRectF(0,0,self.width()-1,self.height()-1)
p.setPen(Qt.NoPen)
path = QtGui.QPainterPath()
path.setFillRule(Qt.WindingFill )
path.addRoundedRect(rect, 15.0, 15.0)
path.addRect(self.width()-13, 0, 13, 13)
p.fillPath(path, self.color)
super(chatLabel, self).paintEvent(e)
def resizeEvent(self, e): #Due to a bug in Qt, we need this. ref:https://bugreports.qt.io/browse/QTBUG-37673
#heightForWidth rely on minimumSize to evaulate, so reset it before
self.setMinimumHeight( 0 )
# define minimum height
self.setMinimumHeight( self.heightForWidth( self.width() ) )
if self.width()>256:
self.setWordWrap(True)
self.setMinimumWidth(128)
super(chatLabel, self).resizeEvent(e)
这是上述子类标签的结果
我怎样才能达到我想要的样子? N、 B:我知道我可以用图像来做,但这需要根据文本大小缩放图像(9片)
我理解你说的话如下:
说明
你不能同时显示三角形提示和文本,因为圆形矩形(我称之为“气泡”)的大小几乎等于标签的大小大小。所以我试着改变它。在
为了改变这一点,我计算了每个文本的气泡大小。 我做了这个功能:
这将计算每个字符的文本宽度。 并返回长度。 如果长度大于气泡宽度(标签宽度-线条路径长度) ,我插入“\n”进行包装。在
如果设置
^{pr2}$setWrap(True)
,它将变得混乱。因为这意味着如果文本到达末尾,文本将被包装标签。所以我删除了这个方法。在为了在每次调整大小时重新计算文本的位置,将所有文本合并为一个很重要字符串。和我们计算绳子的长度, 我们把文本分开,每一个长度都超过了气泡的宽度。在
我们一遍又一遍地做。在
作为解释,我划分了标签和气泡的大小。 气泡的宽度是根据文本的长度来划分的。在
附言
计算非常繁琐。如果你使用列表理解,它可能会变得紧凑,等等。。。在
我希望这个计算不是这个应用程序的瓶颈。。。在
如果还留着什么东西,请尽管问我。在
更新
正如你所说,我的代码是一个陷阱。 我将线边缘移到中心点。在
我认为这是最适合上边缘的地方。在
我想我找到了一个简单的解决方法。在
因为问题是,如果我在右角做了一个提示,文本中的一个移动就需要使文本包含在圆形矩形(气泡)中。我们可以通过在样式表中使用填充来实现这种转换,这将使文本从角落移动。因此,文本将显示为它包含在气泡中。在
感谢用户9402680的回答和他的代码片段,我在其中添加了样式表行以达到所需的效果。在
相关问题 更多 >
编程相关推荐