Нет эффекта от ZoomIn в QTextEdit после изменения размера шрифта - PullRequest
4 голосов
/ 05 ноября 2011

Этот код запускает небольшое окно с панелью инструментов и областью QTextEdit.

Если вы выделите «бананы» и измените размер шрифта, то при использовании масштабирования с помощью кнопок панели инструментов или колесика мыши 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_()

1 Ответ

2 голосов
/ 05 ноября 2011

Реализация по умолчанию QTextEdit.zoomIn/Out просто меняет pointSize базового шрифта для редактирования текста.

Метод, используемый в примере для изменения размера шрифта, переносит выбранное слово в span тег и использует встроенный CSS, чтобы установить для свойства font-size фиксированное значение.Это означает, что когда текстовое редактирование впоследствии будет увеличено, будет затронут только неизмененный текст.

Эту проблему можно было бы решить, используя относительные размеры шрифта.Тем не менее, похоже, что поддерживается только ограниченное подмножество css properties , поэтому можно установить только неточные значения, такие как small, large и т. Д.

Это можно реализоватьв примере внесем следующие изменения:

    # 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)
...