cya*_*dem 2 python qpainter python-3.x qlabel pyqt5
在尝试使用 Python 和 PyQt5 时,我遇到了一个问题。我的 GUI 中有一些标签(QLabel)和图像(QPixmap),我想在它们上画一些东西,具体取决于主程序的功能。我不知道怎么办。例如,我从 BinColUI 类调用 setLabels() 更改标签上的文本,然后我想在它们上绘制一些内容(即 QPainter.drawLine())。我尝试过的方法不起作用,没有绘制任何内容。我不成功的尝试在 setLabels() 中被注释掉。我该怎么做?
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget
class BinColUI(QMainWindow):
def __init__(self):
super().__init__()
self.initUi()
self.createLabelTop()
self.createLabelBot()
def initUi(self):
self.setWindowTitle('Bin Collection')
self.setFixedSize(500, 500)
# self.setStyleSheet('background-color: white')
self.generalLayout = QVBoxLayout()
self._centralWidget = QWidget(self)
self.setCentralWidget(self._centralWidget)
self._centralWidget.setLayout(self.generalLayout)
def paintEvent(self, event):
self.qp = QPainter()
self.qp.begin(self)
self.drawLine(event, self.qp)
self.qp.end()
def drawLine(self, event, qp):
pen = QPen(Qt.red, 3, Qt.SolidLine)
qp.setPen(pen)
qp.drawLine(5, 5, 495, 5)
qp.drawLine(495, 5, 495, 495)
qp.drawLine(495, 495, 5, 495)
qp.drawLine(5, 495, 5, 5)
def createLabelTop(self):
self.label_top = QLabel('PLEASE WAIT')
self.label_top.setAlignment(Qt.AlignCenter)
self.label_top.setFixedSize(450, 60)
self.label_top.setStyleSheet("font: 14pt Bahnschrift; color: black; background-color: yellow")
self.generalLayout.addWidget(self.label_top, alignment=Qt.AlignCenter)
def createLabelBot(self):
self.label_bot = QLabel('PLEASE WAIT')
self.label_bot.setAlignment(Qt.AlignCenter)
self.label_bot.setFixedSize(450, 60)
self.label_bot.setStyleSheet("font: 14pt Bahnschrift; color: black; background-color: yellow")
self.generalLayout.addWidget(self.label_bot, alignment=Qt.AlignCenter)
def setLabels(self, texttop, textbot):
# qp = QPainter(self.label_top)
self.label_top.setText(texttop)
self.label_bot.setText(textbot)
# pen = QPen(Qt.red, 3)
# qp.setPen(pen)
# qp.drawLine(10, 10, 50, 50)
# self.label_top.repaint()
class BinColCtrl:
def __init__(self, view: BinColUI):
self._view = view
self.calculateResult()
def calculateResult(self):
line_top = 'NEW LABEL TOP'
line_bottom = 'NEW LABEL BOTTOM'
self._view.setLabels(line_top, line_bottom)
def main():
"""Main function."""
# Create an instance of `QApplication`
bincol = QApplication(sys.argv)
window = BinColUI()
window.show()
BinColCtrl(view=window)
sys.exit(bincol.exec_())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
一般来说,QWidget(QLabel、QPushButton 等)的绘制只能在 PaintEvent 方法中完成,OP 似乎知道这一点。该绘制取决于小部件拥有的信息,例如 QLabel 使用文本并绘制文本,或者使用 QPixmap 并基于该像素图进行绘制。因此,在这种情况下,您必须在绘制线条的地方创建一个 QPixmap,并将该 QPixmap 传递给 QLabel 来绘制它。
def setLabels(self, texttop, textbot):
pixmap = QPixmap(self.label_top.size())
pixmap.fill(Qt.transparent)
qp = QPainter(pixmap)
pen = QPen(Qt.red, 3)
qp.setPen(pen)
qp.drawLine(10, 10, 50, 50)
qp.end()
self.label_top.setPixmap(pixmap)
self.label_bot.setText(textbot)
Run Code Online (Sandbox Code Playgroud)
标签上不能有文字和画线吗?
正如我在回答的第一部分中已经指出的:要么绘制文本,要么绘制 QPixmap,不能在 QLabel 中同时执行这两项操作。
我可以使用 绘制线条然后在其上绘制文字QPainter.drawText()吗?
是的,您可以使用所有方法在 QPixmap 中绘制文本:发挥创意:-)。例如:
def setLabels(self, texttop, textbot):
pixmap = QPixmap(self.label_top.size())
pixmap.fill(Qt.transparent)
qp = QPainter(pixmap)
pen = QPen(Qt.red, 3)
qp.setPen(pen)
qp.drawLine(10, 10, 50, 50)
qp.drawText(pixmap.rect(), Qt.AlignCenter, texttop)
qp.end()
self.label_top.setPixmap(pixmap)
self.label_bot.setText(textbot)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8866 次 |
| 最近记录: |