QLabel设置多行文字显示不同样式

记得才学Qt的时候做了一个键盘,当时对Qt的样式还是不太熟悉,为了实现上面符号+下面数字的键盘效果,用PS做了一套图……下图蓝框中的几个QPushButton实质上都是贴图。

当时原本是准备用QPushButton设置两行Text,并显示不同样式,然后没做到,只能实现换行但改不了文字样式,后来就只能贴图了,文字换行的代码是这样的:

btn->setText("Test1\r\nTest2"); 

 

今天做上面图标+下面文字的QPushButton时,突然想到了以前没填完的这个坑,特地翻出这个键盘程序,缅怀一下在EFORT实习的这段经历,以及填完坑。

方法其实很简单,引入HTML的语法,既然Qt中可以用qss,那当然也可以用HTML。下面的代码创建了一个QLabel,用HTML设置了其中的文字,实现了多行文字显示不同样式的功能。嫌弃文字不居中的也可以加个HTML上的<center>。这里选择用QLabel而不用QPushButton是因为QPushButton对HTML样式无效,勉强用QLabel代替一下。

QLabel *label = new QLabel(this);
label->setText("<font style = 'font-size:15px; color:#FF0000;'> Test </font>"
               "<br/>"
               "<font style = 'font-size:20px; color:#00FF00; font-weight:bold'> Text </font>");
label->setStyleSheet("border:2px solid blue; border-radius:10px");

 效果如下:

 

这里有个弊端,就是QLabel并不像QPushButton一样自带点击事件 ,所以要手动添加点击事件,有下面两种方法:

  1. 使用eventFilter事件过滤器;
  2. 提升控件,继承QLabel,重写mousePressEvent()函数。
  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用QLabel的setWordWrap属性来显示多行文本。将其设置为True,然后使用setText方法设置文本内容即可。 示例代码: ``` from PyQt5.QtWidgets import QApplication, QWidget, QLabel class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): label = QLabel(self) label.setWordWrap(True) label.setText("这是第一行文本\n这是第二行文本\n这是第三行文本") self.setGeometry(300, 300, 250, 150) self.setWindowTitle('多行文本') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) ``` 运行后,会显示三行文本。 ### 回答2: PyQt5是一个强大的Python GUI开发工具包,它提供了一个QLabel小部件,用户可以将其用于显示单行或多行文本。在PyQt5中,我们可以通过以下步骤来实现QLabel显示多行文本: 1. 将多行文本符串分割成一系列单独的文本行。 2. 创建一个包含这些文本行的Python列表。 3. 将Python列表中的文本行连接成一个单独的多行文本符串。 4. 将多行文本符串设置QLabel部件的文本内容。 下面是一个示例代码,展示了如何使用PyQt5将多行文本显示QLabel控件中: ``` import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtGui import QPainter, QTextFormat, QFontMetrics class MyLabel(QLabel): def __init__(self, text): super().__init__() self.setText(text) self.setWordWrap(True) self.setAlignment(Qt.AlignTop) self.textFormat = QTextFormat() self.textFormat.setFont(self.font()) self.updateGeometry() def setText(self, text): self.text = text lines = text.split("\n") self.textLines = [] self.textWidth = 0 fontMetrics = QFontMetrics(self.font()) for line in lines: lineWidth = fontMetrics.width(line) self.textWidth = max(self.textWidth, lineWidth) self.textLines.append(line) self.textHeight = fontMetrics.height() * len(self.textLines) super().setText(text) def paintEvent(self, event): painter = QPainter(self) for i, line in enumerate(self.textLines): yPos = (i + 1) * self.textFormat.height() painter.drawText(0, yPos, line) def minimumSizeHint(self): return QSize(self.textWidth, self.textHeight) def sizeHint(self): return QSize(self.textWidth, self.textHeight) if __name__ == '__main__': app = QApplication(sys.argv) w = QWidget() text = "第一行文本\n第二行文本\n第三行文本" label = MyLabel(text) label.move(20, 20) w.setGeometry(100, 100, 250, 150) w.setWindowTitle('PyQt5 Label 多行文本') w.show() sys.exit(app.exec()) ``` 在上面的代码中,我们创建了一个名为MyLabel的自定义QLabel部件,然后重写了setText()、paintEvent()、minimumSizeHint()和sizeHint()方法。setText()方法用于将多行文本符串拆分成一系列单独的文本行,并计算整个文本的宽度和高度。paintEvent()方法使用QPainter绘制每个文本行。minimumSizeHint()和sizeHint()方法分别返回部件最小和理想的大小。 通过使用自定义的MyLabel控件,我们可以轻松地将多行文本显示在PyQt5应用程序中。 ### 回答3: 在使用pyqt5中,如果需要在qlabel显示多行文本,可以通过设置qlabel控件的'wordWrap'属性以及使用HTML标记来实现。 首先,在pyqt5中,我们可以使用setWordWrap()方法来设置qlabel控件的'wordWrap'属性,代码如下: ```python label = QLabel() label.setWordWrap(True) ``` 接下来,我们需要通过HTML标记来控制qlabel文本的格式。具体来说,我们可以使用'<br>'标记来控制文本的换行;使用'<p>'标记来分段显示文本。 例如,下面的代码演示了如何使用HTML标记以及setWordWrap()方法来显示多行文本: ```python label = QLabel() label.setText("<html><body>" "<p>This is the first line.</p>" "<p>This is the second line.</p>" "<p>This is the third line.</p>" "</body></html>") label.setWordWrap(True) ``` 在上面的代码中,我们先使用HTML标记来控制qlabel控件中文本的格式。然后,通过setText()方法来将HTML代码赋给qlabel文本。最后,使用setWordWrap()方法来启用单词换行。 通过以上方法,我们可以非常方便地在pyqt5中实现qlabel控件的多行文本显示
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值