Lack of ZoomIn effect in QTextEdit after changing font size

This code launches a small window with a toolbar and a QTextEdit area.

If you select "bananas" and change the font size, then using the increase using the buttons on the toolbar or CTRL + mouse wheel will only change the size of the "apples". Does anyone know why?

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_() 
+4
source share
1 answer

The standard implementation of QTextEdit.zoomIn/Out simply modifies the pointSize base font for text editing.

The method used in this example to change the font size wraps the selected word with a span tag and uses the built-in css to set the font-size property to a fixed value. This means that with a subsequent increase in the editing text, only the invariable text will be affected.

It would be possible to overcome this problem using relative font sizes. However, it seems that only a limited subset of css properties is supported, so it can only be set to inaccurate values ​​such as small , large , etc.

This can be implemented in this example by making the following changes:

  # 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) 
+2
source

Source: https://habr.com/ru/post/1379724/


All Articles