2011-11-02 47 views
3

是否可以縮放(或「縮放」)QTextEdit區域?我相信我讀過在QLayout中放置QTextEdit可以允許縮放QTextEdit區域,但沒有找到如何實現它。選項夫婦...如何從工具欄按鈕單擊和/或按Ctrl +鼠標滾輪縮放/縮放QTextEdit區域

鼠標滾輪CTRL +滾動
運行下面的代碼,按住CTRL(控制)鍵,滾動鼠標滾輪,該事件被捕獲與文中規模(以但是,隨着文本越來越大,輪子必須進一步移動以產生非常大的效果,所以一個目標就是能夠以某種方式修改它,也許一些數學方法可以在增加更大程度上增加增量在正向。 (下面的setReadOnly()的下面是因爲它看起來textEdit必須是ReadOnly(False)才能捕獲鼠標事件,然後True才能在滾動鼠標滾輪期間縮放,所以它然後在釋放CTRL鍵時再次回到原始狀態False)。

工具欄按鈕點擊
另一種選擇是工具欄按鈕的放大和縮小。
onZoomInClicked()被調用。

當前的一些問題,下面
1.打印代碼: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規模/變焦的工作,如果它甚至有可能。

回答

4

兩個錯誤消息可以expained如下:

  1. QMainWidget自動獲取的佈局,所以QFormLayout是多餘的。如果要添加布局,請創建QWidget作爲中心小部件,並使其成爲新佈局的父項。其他小部件可以添加到新的佈局。
  2. QWidget子類的父類本身必須是QWidget子類,其中QFormLayout不是。

我修改了你的例子,以便它能完成你所要求的大部分工作。請注意,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_() 
+0

太棒了,哇。 **謝謝ekhumoro!** – gseattle