首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtGui.QPainter覆盖在QtGui.QTextEdit上

QtGui.QPainter覆盖在QtGui.QTextEdit上
EN

Stack Overflow用户
提问于 2014-05-18 09:12:43
回答 1查看 648关注 0票数 1

我创建了一个小小的文本编辑器,用户可以通过在文本块上盘旋并旋转鼠标来增加字体大小。到目前为止,这部分还在起作用。我的问题是想象字体大小的变化。

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

我收到了一个"QPainter:: begin :小部件绘制只能由于paintEvent“错误开始的消息。

代码语言:javascript
复制
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()

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-18 19:24:47

我删除了Painter类,并将它的代码放在SuperText类中;编辑了paintEvent()和wheelEvent(),最后得到如下结果:

代码语言:javascript
复制
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

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23720349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档