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

Python 如何从工具栏按钮单击和/或ctrl+缩放QTextEdit区域;鼠标滚轮,python,pyqt,pyqt4,pyside,Python,Pyqt,Pyqt4,Pyside,是否可以缩放(或“缩放”)QTextEdit区域?我相信我读过,在QLayout中放置QTextEdit可以允许扩展QTextEdit区域,尽管我没有找到如何实现它。两个选择 按住CTRL键并滚动鼠标滚轮 运行下面的代码,按住CTRL(control)键并滚动鼠标滚轮,事件被捕获,文本确实会缩放(至少在Windows上是这样),但是,随着文本变大,滚轮必须移动得越来越远,才能产生非常大的效果,因此一个目标是能够以某种方式修改它,也许需要一些数学知识,在正方向上增加增量到更大的程度 (下面的set

是否可以缩放(或“缩放”)QTextEdit区域?我相信我读过,在QLayout中放置QTextEdit可以允许扩展QTextEdit区域,尽管我没有找到如何实现它。两个选择

按住CTRL键并滚动鼠标滚轮
运行下面的代码,按住CTRL(control)键并滚动鼠标滚轮,事件被捕获,文本确实会缩放(至少在Windows上是这样),但是,随着文本变大,滚轮必须移动得越来越远,才能产生非常大的效果,因此一个目标是能够以某种方式修改它,也许需要一些数学知识,在正方向上增加增量到更大的程度

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

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

以下代码当前存在的一些问题
1.它打印:
QLayout:正在尝试将QLayout“”添加到主窗口“”,该窗口已经有了布局,但我还没有意识到这一点。
2.QtGui.QTextEdit(self.formLayout)而不是(self)将文本编辑区域放置在布局中会产生
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_()
从PySide导入QtGui,QtCore
类主窗口(QtGui.QMainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.formLayout=QtGui.QFormLayout(self)
self.textEdit=QtGui.QTextEdit(self)
self.toolBar=QtGui.QToolBar(self)
self.actionZoomIn=QtGui.QAction(self)
self.textdedit.setHtml('Hello world')
self.setCentralWidget(self.textEdit)
self.addToolBar(self.toolBar)
self.toolBar.addAction(self.actionZoomIn)
self.actionZoomIn.setText('放大')
self.actionZoomIn.connect(self.actionZoomIn,
QtCore.SIGNAL('triggered()')、self.onZoomInClicked)
def onZoomInClicked(自):
打印“onZoomInClicked(自我)需要代码”
def wheelEvent(自我,事件):
打印“wheelEvent()已捕获”
if(event.modifiers()&QtCore.Qt.ControlModifier):
self.textEdit.setReadOnly(True)
event.accept()
def钥匙释放事件(自身、evt):
如果evt.key()==QtCore.Qt.key\u控件:
self.textEdit.setReadOnly(False)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QtGui.QApplication([])
frame=main窗口()
frame.show()
app.exec()

我已经努力解决这一问题好几天了,因此如果有可能的话,让更可定制的QTextEdit缩放/缩放功能发挥作用将是非常棒的。

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

  • QMainWidget
    自动获取布局,因此
    QFormLayout
    是冗余的。如果要添加布局,请创建一个
    QWidget
    作为中心小部件,并使其成为新布局的父级。然后可以将其他小部件添加到新布局中
  • QWidget
    子类的父类本身必须是
    QWidget
    子类,而
    QFormLayout
    不是
  • 我修改了你的例子,使它能满足你的大部分要求。请注意,和都使用
    范围
    参数来控制缩放程度

    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_()
    
    从PySide导入QtGui,QtCore
    类主窗口(QtGui.QMainWindow):
    def uuu init uuu(self,parent=None):
    超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
    self.textEdit=编辑器(self)
    self.toolBar=QtGui.QToolBar(self)
    self.actionZoomIn=QtGui.QAction('放大',self)
    self.actionZoomOut=QtGui.QAction('Zoom Out',self)
    self.textdedit.setHtml('Hello world')
    self.setCentralWidget(self.textEdit)
    self.addToolBar(self.toolBar)
    self.toolBar.addAction(self.actionZoomIn)
    self.toolBar.addAction(self.actionZoomOut)
    self.actionZoomIn.triggered.connect(self.onZoomin已单击)
    self.actionZoomOut.tricked.connect(self.onZoomOutClicked)
    def onZoomInClicked(自):
    self.textEdit.zoom(+1)
    def onZoomOutClicked(自):
    self.textEdit.zoom(-1)
    类编辑器(QtGui.QTextEdit):
    def uuu init uuu(self,parent=None):
    超级(编辑,自我)。\uuuu初始化\uuuuu(父级)
    def缩放(自身,增量):
    如果δ<0:
    自我保护(1)
    elif delta>0:
    自我放大(5)
    def wheelEvent(自我,事件):
    if(event.modifiers()&QtCore.Qt.ControlModifier):
    self.zoom(event.delta())
    其他:
    QtGui.QTextEdit.wheelEvent(self,event)
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    导入系统
    app=QtGui.QApplication(sys.argv)
    窗口=主窗口()
    window.show()
    app.exec()