如何从工具栏按钮单击和/或按Ctrl +鼠标滚轮缩放/缩放QTextEdit区域

时间:2011-11-02 22:04:11

标签: python pyqt pyqt4 pyside

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

CTRL +滚轮鼠标滚轮
运行下面的代码,按住CTRL(控制)键并滚动鼠标滚轮,事件被捕获,文本可以缩放(至少在Windows上),但是,随着文本变大,轮子必须进一步移动对于非常有效的,所以一个目标是能够以某种方式修改,也许一些数学可以在正方向上增加更大程度上增加增量。

(下面的setReadOnly()是因为看起来textEdit必须是ReadOnly(False)才能捕获鼠标事件,然后True才能在滚动鼠标滚轮时进行缩放,所以然后在释放CTRL键时再次将其设置回原始状态。

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

以下代码的一些当前问题
它打印出来:QLayout: Attempting to add QLayout "" to MainWindow "", which already has a layout我还没有把头包裹起来。
2. QtGui.QTextEdit(self.formLayout)而不是(self)将textEdit区域放置在布局中生成TypeError: 'PySide.QtGui.QTextEdit' called with wrong argument types
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缩放/缩放功能。

1 个答案:

答案 0 :(得分:4)

可以按如下方式解释这两条错误消息:

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

    我修改了你的例子,以便它完成你所要求的大部分内容。请注意,QTextEdit.zoomInQTextEdit.zoomOut都会使用range参数来控制缩放程度。

    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_()