Hi all,
I'm new to pyqt and am having a bit of trouble. I'm trying to make a (_very_)
simple report designer. Right now I'm just trying to get a feel for what I can
do in pyqt and so I've laid out a simple program that represents a document
with several bands (if you are familiar with Crystal, you've seen the band
style designer I'm trying to emulate). I feel I'm getting closer, but right
now i'm just hacking at it so I feel I should ask for some guidance at this
point. A few of the issues I'm having are:
1) Resizer.paintEvent is getting called... a lot. I'm not really sure why.
2) When I resize the inner window, i don't wan't contents to resize, but if I
don't have the inner widget set to resizable, things are worse. How can I have
it both ways? I guess what I am trying to say is I want the only way to resize
a band be via the Resizer (or eventually some scale factor). Not by dragging
the window.
3) General resizing issues. Top band doesn't get smaller when I drag the
Resizer up.
When i drag top Resizer down it makes the top one bigger the middle one
gets smaller instead of just being pushed down, etc...
What can I try in order to get the layouts to function like I envision?
Any guidance on what I can try to straighten some of these issues out would be
appreciated. Or, if I'm just going about this the wrong way, please let me
know (though I've swiped the ideas from several similar projects...)
Thanks,
Lee
Below is the code (hopefully not too long to post here):
#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui
class CustomWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
def paintEvent(self, event):
print "paintEvent"
paint = QtGui.QPainter()
paint.begin(self)
size = self.size()
w = size.width()
h = size.height()
pen = QtGui.QPen(QtGui.QColor(20, 20, 20), 1, QtCore.Qt.SolidLine)
paint.setPen(pen)
paint.setBrush(QtCore.Qt.NoBrush)
paint.drawRect(0, 0, w-1, h-1)
paint.end()
class Resizer(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self,parent)
self.setMinimumHeight(5)
self.setMaximumHeight(5)
self.setCursor(QtGui.QCursor(QtCore.Qt.SizeVerCursor))
self.resize(5,50)
print "Resizer.__init__"
def mouseMoveEvent(self, event):
event.accept()
print "here"
y = event.y()
self.emit(QtCore.SIGNAL('MovedResizer'), y)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
print "here"
styles = QtGui.QStyleOption(QtGui.QStyleOption.SO_SizeGrip)
styles.initFrom(self)
self.style().drawControl(QtGui.QStyle.CE_Splitter, styles, painter,
self)
self.setBackgroundRole(QtGui.QPalette.Dark)
class Band(QtGui.QWidget):
def __init__(self, parent=None):
super(Band, self).__init__(parent)
self.rb = Resizer()
# eventually replace with custom edit control
self.lb = CustomWidget()
layout = QtGui.QVBoxLayout(self)
layout.setMargin(0)
layout.setSpacing(0)
layout.addWidget(self.lb)
layout.addWidget(self.rb)
#self.setLayout(layout)
self.connect(self.rb, QtCore.SIGNAL('MovedResizer'), self.changeSize )
def changeSize(self, y):
print "In changeSize %d" % y
h = self.lb.height() + y
if h < 1:
h = 1
print "H = %d" % h
self.lb.setMinimumHeight(h)
#self.lb.setMaximumHeight(h)
#self.lb.resize(self.lb.width(), h)
#self.lb.repaint()
class Document(QtGui.QWidget):
def __init__(self, parent=None):
super(Document, self).__init__(parent)
self.outerLayout = QtGui.QVBoxLayout()
self.myBands = QtGui.QWidget()
self.myBands.setBackgroundRole(QtGui.QPalette.Base)
self.layoutBands = QtGui.QVBoxLayout(self.myBands)
self.layoutBands.setMargin(0)
self.layoutBands.setSpacing(0)
self.scrollArea = QtGui.QScrollArea()
self.scrollArea.setBackgroundRole(QtGui.QPalette.Dark)
self.scrollArea.setWidget(self.myBands)
self.scrollArea.setWidgetResizable(True)
self.outerLayout.addWidget(self.myBands)
def addBand(self):
print "adding band"
self.layoutBands.addWidget(Band())
def getScrollArea(self):
return self.scrollArea
class MyWindow(QtGui.QMainWindow):
def __init__(self, parent = None):
QtGui.QMainWindow.__init__(self, parent)
self.ws = QtGui.QWorkspace(self)
self.ws.setScrollBarsEnabled(True)
self.setCentralWidget(self.ws)
self.doc = Document()
self.doc.addBand()
self.doc.addBand()
self.doc.addBand()
self.ws.addWindow(self.doc.getScrollArea())
self.setWindowTitle(self.tr("Doesn't Quite Work"))
self.resize(640, 480)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
sys.exit(app.exec_())
_______________________________________________
PyQt mailing list [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt