pyqt  

[PyQt] Self-adjusting QTextEdit (PyQt4)

Wildemar Wildenburger
Sat, 26 Apr 2008 05:51:36 -0700

Hello folks,

I'm trying to write a notecard application, somewhat in the vein of Evernote --- basically a succession of little textboxes, one per note, stacked above one another. To that end I'd like a QTextEdit (or similar) that adjusts its height (with given width) so that it always shows all its text, never more, never less.

This is what I've come up with (complete runable example attached):

class MyText(gui.QTextEdit):
   def __init__(self, parent=None):
       gui.QTextEdit.__init__(self, parent)
       self.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
       self.connect(self, core.SIGNAL("textChanged()"), self.updateGeometry)
       policy = gui.QSizePolicy(gui.QSizePolicy.MinimumExpanding,
                                gui.QSizePolicy.Minimum)
       policy.setHeightForWidth(True)
       self.setSizePolicy(policy)
def heightForWidth(self, w):
       return self.document().size().toSize().height()

This does not work as I hoped, naturally. :(

How would I go about this?

regards,
/W
#!/usr/bin/python

import sys
from PyQt4 import QtGui as gui
from PyQt4 import QtCore as core

txt = "Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."

app = gui.QApplication(sys.argv)

class AppWindow(gui.QMainWindow):
    def __init__(self, parent=None):
        gui.QWidget.__init__(self, parent)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Example')
        
        tape = IdeaTape()
        for _ in range(10):
            i = IdeaBox()
            i.setText(txt)
            tape.addIdeaBox(i)
        tapescroller = gui.QScrollArea()
        tapescroller.setWidget(tape)
        tapescroller.setWidgetResizable(True)
        self.setCentralWidget(tapescroller)
        
        exit = gui.QAction(gui.QIcon('gfx/quit.png'), 'Exit', self)
        exit.setShortcut('Esc')
        self.connect(exit, core.SIGNAL('triggered()'), core.SLOT('close()'))


class IdeaBox(gui.QFrame):
    def __init__(self, parent=None):
        gui.QFrame.__init__(self, parent)
        self.setFrameStyle(gui.QFrame.Raised|gui.QFrame.StyledPanel)
        vbox = gui.QVBoxLayout(self)
        self.text = MyText()
        vbox.addWidget(self.text)
    
    def setText(self, text):
        self.text.setText(text)


class MyText(gui.QTextEdit):
    def __init__(self, parent=None):
        gui.QTextEdit.__init__(self, parent)
        self.setVerticalScrollBarPolicy(core.Qt.ScrollBarAlwaysOff)
        self.connect(self, core.SIGNAL("textChanged()"), self.updateGeometry)
        policy = gui.QSizePolicy(gui.QSizePolicy.MinimumExpanding,
                                 gui.QSizePolicy.Minimum)
        policy.setHeightForWidth(True)
        self.setSizePolicy(policy)
    
    def heightForWidth(self, w):
        return self.document().size().toSize().height()


class IdeaTape(gui.QWidget):
    def __init__(self, parent=None):
        gui.QWidget.__init__(self, parent)
        self.vbox = gui.QVBoxLayout(self)
        self.setLayout(self.vbox)
    
    def addIdeaBox(self, ideabox):
        ideabox.setParent(self)
        self.vbox.addWidget(ideabox)


window = AppWindow()
window.resize(800, 600)
window.show()

sys.exit(app.exec_())
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt