Как масштабировать / масштабировать область QTextEdit с помощью нажатия кнопки панели инструментов и / или ctrl + колесико мыши - PullRequest
3 голосов
/ 03 ноября 2011

Можно ли масштабировать (или «масштабировать») область QTextEdit? Я считаю, что я читал, что размещение QTextEdit внутри QLayout может позволить масштабировать область QTextEdit, хотя я не нашел, как это реализовать. Пара вариантов ...

CTRL + колесо мыши
Запустив приведенный ниже код, удерживая нажатой клавишу CTRL (управление) и вращая колесико мыши, происходит захват события и текст масштабируется (по крайней мере, в Windows), однако по мере увеличения текста колесо должно двигаться все дальше и дальше для очень большого эффекта, поэтому одна цель состоит в том, чтобы иметь возможность каким-то образом изменить это, возможно, некоторую математику, чтобы увеличить приращения в большей степени при увеличении в направлении плюс.

(Ниже приведены setReadOnly (), потому что кажется, что textEdit должен иметь значение ReadOnly (False) для захвата события мыши, а затем True, чтобы иметь возможность масштабироваться во время вращения колеса мыши, поэтому затем он снова возвращается в исходное состояние False при отпускании клавиши CTRL.

Нажатие кнопки на панели инструментов
Другой вариант - кнопки панели инструментов для увеличения и уменьшения масштаба.
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. Кнопка панели инструментов (только текст) в настоящий момент запускается по умолчанию при нажатии, однако она содержит только оператор печати. ​​

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, если это возможно.

1 Ответ

4 голосов
/ 03 ноября 2011

Два сообщения об ошибках могут быть расшифрованы следующим образом:

  1. QMainWidget автоматически получает макет, поэтому QFormLayout является избыточным. Если вы хотите добавить макет, создайте QWidget в качестве центрального виджета и сделайте его родителем нового макета. Затем к этому новому макету можно добавить другие виджеты.
  2. Родитель подкласса QWidget сам должен быть подклассом QWidget, который QFormLayout не является.

Я изменил ваш пример так, чтобы он выполнял большую часть того, о чем вы просили. Обратите внимание, что QTextEdit.zoomIn и QTextEdit.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_()
...