2011-11-04 67 views
4

此代碼運行帶有工具欄和QTextEdit區域的小窗口。字體大小更改後,QTextEdit中的ZoomIn沒有影響

如果您突出顯示「香蕉」並更改字體大小,則使用工具欄按鈕或CTRL +鼠標滾輪的縮放將僅調整「蘋果」大小。有人知道爲什麼

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.addToolBar(self.toolBar) 
     self.setCentralWidget(self.textEdit) 
     self.textEdit.setHtml('<font color=blue>apples bananas</font>') 

     # Zoom 
     self.actionZoomIn = QtGui.QAction('Zoom In', self) 
     self.actionZoomOut = QtGui.QAction('Zoom Out', self) 
     self.toolBar.addAction(self.actionZoomIn) 
     self.toolBar.addAction(self.actionZoomOut) 
     self.actionZoomIn.triggered.connect(self.onZoomInClicked) 
     self.actionZoomOut.triggered.connect(self.onZoomOutClicked) 

     # Font Size 
     self.comboSize = QtGui.QComboBox(self.toolBar) 
     self.toolBar.addWidget(self.comboSize) 
     self.comboSize.addItem('0') 
     self.comboSize.addItem('10') 
     self.comboSize.addItem('18') 
     self.comboSize.addItem('30') 
     self.comboSize.addItem('48') 
     self.comboSize.setCurrentIndex(1) 
     self.comboSize.activated[str].connect(self.textSize) 

    def textSize(self, pointSize): 
     pointSize = int(pointSize) 
     if pointSize > 0: 
      fmt = QtGui.QTextCharFormat() 
      fmt.setFontPointSize(pointSize) 
      self.mergeFormatOnWordOrSelection(fmt) 

    def mergeFormatOnWordOrSelection(self, format): 
     cursor = self.textEdit.textCursor() 
     if not cursor.hasSelection(): 
      cursor.select(QtGui.QTextCursor.WordUnderCursor) 

     cursor.mergeCharFormat(format) 
     self.textEdit.mergeCurrentCharFormat(format) 

    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) 
     self.zoomValue = 0 

    def zoom(self, delta): 
     zoomIncrement = 3 

     if delta < 0: 
      zoomIncrement = 0 - zoomIncrement 

     self.zoomIn(zoomIncrement) 
     self.zoomValue = self.zoomValue + zoomIncrement 

     print "self.zoomValue", self.zoomValue 

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

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    window.resize(400, 180) 
    window.show() 
    app.exec_() 

回答

2

QTextEdit.zoomIn/Out默認實現只是改變了文本編輯的基本字體的pointSize

示例中用於更改字體大小的方法將所選單詞包裝在span標記中,並使用內聯css將font-size屬性設置爲固定值。這意味着當文本編輯隨後被縮放時,只有未更改的文本纔會受到影響。

通過使用相對字體大小可以解決這個問題。然而,它看起來像只支持css properties一個限定日期子集,因此它只能設定數值不精確像smalllarge

這可以在例如通過以下的改變來實現:

# Font Size 
    self.comboSize = QtGui.QComboBox(self.toolBar) 
    self.toolBar.addWidget(self.comboSize) 
    self.comboSize.addItem('small') 
    self.comboSize.addItem('medium') 
    self.comboSize.addItem('large') 
    self.comboSize.addItem('x-large') 
    self.comboSize.addItem('xx-large') 
    self.comboSize.setCurrentIndex(1) 
    self.comboSize.activated[int].connect(self.textSize) 

def textSize(self, size): 
    fmt = QtGui.QTextCharFormat() 
    fmt.setProperty(QtGui.QTextFormat.FontSizeAdjustment, size - 1) 
    self.mergeFormatOnWordOrSelection(fmt)