gpt4 book ai didi

python - QtGui.QPainter 覆盖在 QtGui.QTextEdit 之上

转载 作者:行者123 更新时间:2023-12-01 05:13:22 29 4
gpt4 key购买 nike

我创建了一个小型文本编辑器,用户可以通过将鼠标悬停在文本 block 上并旋转鼠标滚轮来增加字体大小。到目前为止,该部分正在发挥作用。我的问题是关于可视化字体大小的变化。

我想在鼠标位置画一个圆圈并在其中显示当前的字体大小。到目前为止,我不确定如何将其覆盖(文本仍然可读)在我的 QTextEdit 之上。

我收到“QPainter::begin:小部件绘制只能作为 PaintEvent 的结果开始”错误。

import sys
from PyQt4 import QtGui, QtCore
import re
from itertools import chain

class Painter(QtGui.QWidget):
def __init__(self, parent=None):
super(Painter, self).__init__(parent)
self.paintEvent()
#the line above probably triggers the error

def paintEvent(self):
qp = QtGui.QPainter(self)
self.drawCircle(qp)
self.drawText(qp)

def drawText(self, qp):
qp.setPen(QtGui.QColor(0, 0, 0))
qp.setFont(QtGui.QFont('Decorative', 32))
st = SuperText()
x = st.mouseX - 55
y = st.mouseY + 16
qp.drawText(x, y, "TEST")

def drawCircle(self, qp):
st = SuperText()
x = st.mouseX
y = st.mouseY
qp.setBrush(QtGui.QColor(0, 0, 255))
self.center = QtCore.QPoint(x, y)
qp.drawEllipse(self.center, 80, 80)


class SuperText(QtGui.QTextEdit):

def __init__(self):
super(SuperText, self).__init__()
#....

def initUI(self):
self.setGeometry(0, 0, 640, 480)
self.setWindowTitle('SuperText')
self.setFocusPolicy(QtCore.Qt.StrongFocus)
self.setMouseTracking(True)
self.show()

def wheelEvent(self, ev):
super(SuperText, self).wheelEvent(ev)
self.generateTemplate()
self.renderTemplate()
self.mouseX = ev.x()
self.mouseY = ev.y()
anc = self.anchorAt(ev.pos())
if (anc):
self.changeSize(anc, ev.delta())
painter = Painter(self)
painter.update()

def onTextChanged(self):
# update text when user inputs text
self.text = self.toPlainText()
self.readText()

def readText(self):
data = self.text
# split textfile at linebreak
self.paragraphs = data.split("\n")
for i in range(len(self.paragraphs)):
# set standard size for each paragraph
self.sizes.append(14)

def generateTemplate(self):
p = self.paragraphs
content = "".join(str(i) for i in chain(*p))
if len(p) == 0:
self.template = p
return
for i in range(len(p)):
size = str(self.sizes[i])
content = re.sub(str(p[i]),
"<a class='paragraph' href='%d' style='color:#000; text-decoration:none;'><p style='font-size:%spx'>$%d$</p></a>" % (i, size, i),
content, count=1)
content = content + "<style>a:hover { background: #f00; }</style>"
self.template = content

def renderTemplate(self):
cur = self.textCursor()
doc = self.template
for i, paragraph in enumerate(self.paragraphs):
doc = doc.replace('$' + str(i) + '$', '%s' % (paragraph))
self.setHtml(doc)
self.setTextCursor(cur)

def changeSize(self, paragraphId, amount):
i = int(paragraphId)
size = self.sizes[i]
newSize = self.sizes[i] + (amount / 120)
self.sizes[i] = newSize
htmlCheck = self.toHtml()
self.generateTemplate()
self.renderTemplate()


def main():
app = QtGui.QApplication(sys.argv)
super_text = SuperText()
sys.exit(app.exec_())


if __name__ == '__main__':
main()

有人可以解释我做错了什么或指出我正确的方向吗?

最佳答案

我消除了 Painter 类并将其代码放在 SuperText 类中;编辑paintEvent()和wheelEvent()我最终得到了这个:

def paintEvent(self, event):
qp = QtGui.QPainter()
qp.begin(self.viewport())
self.drawCircle(qp)
self.drawText(qp)
qp.end()
super(SuperText, self).paintEvent(event)
#the last line ensures the visiblity of the QTextedit

def wheelEvent(self, ev):
self.generateTemplate()
self.renderTemplate()
self.mouseX = ev.x()
self.mouseY = ev.y()
anc = self.anchorAt(ev.pos())
if (anc):
self.changeSize(anc, ev.delta())
self.update()

关于python - QtGui.QPainter 覆盖在 QtGui.QTextEdit 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23720349/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com