python-如何通过工具栏按钮单击和/或ctrl鼠标滚轮缩放/缩放QTextEdit区域

是否可以缩放(或“缩放”)QTextEdit区域?我相信我读到将QTextEdit放在QLayout中可以允许缩放QTextEdit区域,尽管没有找到如何实现它.几个选择…

鼠标滚轮的CTRL滚
运行下面的代码,按住CTRL(控制)键并滚动鼠标滚轮,会捕获事件并且文本确实会缩放(至少在Windows上是这样),但是,随着文本的增大,滚轮必须越来越远为了达到很大的效果,所以一个目标是能够以某种方式修改该值,也许是一些数学方法,以使加号方向上的增量在更大程度上增加增量.

(下面的setReadOnly()的原因是,似乎要捕获鼠标事件,textEdit必须为ReadOnly(False),然后为True才能在鼠标滚轮滚动时缩放,因此将其设置为释放CTRL键后,原始状态再次变为False).

工具栏按钮请点击
另一个选项是用于放大和缩小的工具栏按钮.
onZoomInClicked()被调用.

以下代码目前存在一些问题
1.打印:QLayout:尝试将QLayout“”添加到MainWindow“”,该窗口已经具有布局,但我还没有将其包裹住.
2. QtGui.QTextEdit(self.formLayout)而不是(self)将textEdit区域放置在布局内会产生TypeError:’PySide.QtGui.QTextEdit’用错误的参数类型调用
3. wheelEvent()可以使用某种方式来修改event.delta()吗?
4.单击时,工具栏按钮(仅文本)当前将运行其def,但是它仅包含打印语句.

from PySide import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.formLayout   = QtGui.QFormLayout(self)
        self.textEdit     = QtGui.QTextEdit(self)
        self.toolBar      = QtGui.QToolBar(self)
        self.actionZoomIn = QtGui.QAction(self)
        self.textEdit.setHtml('<font color=blue>Hello <b>world</b></font>')
        self.setCentralWidget(self.textEdit)
        self.addToolBar(self.toolBar)
        self.toolBar.addAction(self.actionZoomIn)
        self.actionZoomIn.setText('Zoom In')
        self.actionZoomIn.connect(self.actionZoomIn,
            QtCore.SIGNAL('triggered()'), self.onZoomInClicked)

    def onZoomInClicked(self):
        print "onZoomInClicked(self) needs code"

    def wheelEvent(self, event):
        print "wheelEvent() captured"
        if (event.modifiers() & QtCore.Qt.ControlModifier):
            self.textEdit.setReadOnly(True)

            event.accept()            

    def keyReleaseEvent(self, evt):
        if evt.key() == QtCore.Qt.Key_Control:
            self.textEdit.setReadOnly(False)

if __name__ == '__main__':
    app   = QtGui.QApplication([])
    frame = MainWindow()
    frame.show()
    app.exec_()

我一直在努力解决这一问题,因此,即使有可能,使更可自定义的QTextEdit缩放/缩放功能也很好.

解决方法:

这两个错误消息可以解释如下:

> QMainWidget自动获取布局,因此QFormLayout是多余的.如果要添加布局,请创建一个QWidget作为*窗口小部件,并使其成为新布局的父级.然后可以将其他小部件添加到该新布局.
> QWidget子类的父类本身必须是QWidget子类,而QFormLayout不是.

我已经修改了您的示例,使其可以执行您所要求的大部分内容.请注意,QTextEdit.zoomInQTextEdit.zoomOut都采用范围参数来控制缩放程度.

from PySide import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.textEdit = Editor(self)
        self.toolBar = QtGui.QToolBar(self)
        self.actionZoomIn = QtGui.QAction('Zoom In', self)
        self.actionZoomOut = QtGui.QAction('Zoom Out', self)
        self.textEdit.setHtml('<font color=blue>Hello <b>world</b></font>')
        self.setCentralWidget(self.textEdit)
        self.addToolBar(self.toolBar)
        self.toolBar.addAction(self.actionZoomIn)
        self.toolBar.addAction(self.actionZoomOut)
        self.actionZoomIn.triggered.connect(self.onZoomInClicked)
        self.actionZoomOut.triggered.connect(self.onZoomOutClicked)

    def onZoomInClicked(self):
        self.textEdit.zoom(+1)

    def onZoomOutClicked(self):
        self.textEdit.zoom(-1)

class Editor(QtGui.QTextEdit):
    def __init__(self, parent=None):
        super(Editor, self).__init__(parent)

    def zoom(self, delta):
        if delta < 0:
            self.zoomOut(1)
        elif delta > 0:
            self.zoomIn(5)

    def wheelEvent(self, event):
        if (event.modifiers() & QtCore.Qt.ControlModifier):
            self.zoom(event.delta())
        else:
            QtGui.QTextEdit.wheelEvent(self, event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
上一篇:hadoop分布式系统架构详解


下一篇:python-qrc文件ui文件不起作用