Seite 1 von 1

[PyQt] Anfänger Problem

Verfasst: 29. März 2009 13:36
von jeroen
hi,

ich will in einem borderlayout ein selbst gezeichnets widget im norder platzieren. Das Problem ist das es nicht angezeigt wird. (im Zentrum aber schon). Könnte bitte einer von euch über den code gucken.

Hier ist mein code:
BorderLayout.py (aus den Examples):

Code: Alles auswählen

import sys
from PyQt4 import QtCore, QtGui


class ItemWrapper(object):
    def __init__(self, i, p):
        self.item = i
        self.position = p


class BorderLayout(QtGui.QLayout):
    West, North, South, East, Center = range(5)
    MinimumSize, SizeHint = range(2)

    def __init__(self, parent=None, margin=0, spacing=0):
        QtGui.QLayout.__init__(self, parent)

        self.setMargin(margin)
        self.setSpacing(spacing)
        self.list = []

    def __del__(self):
        l = self.takeAt(0)
        while l:
            l = self.takeAt(0)

    def addItem(self, item):
        self.add(item, BorderLayout.West)

    def addWidget(self, widget, position):
        self.add(QtGui.QWidgetItem(widget), position)

    def expandingDirections(self):
        return QtCore.Qt.Horizontal | QtCore.Qt.Vertical

    def hasHeightForWidth(self):
        return False

    def count(self):
        return len(self.list)

    def itemAt(self, index):
        if index < len(self.list):
            return self.list[index].item

        return None

    def minimumSize(self):
        return self.calculateSize(BorderLayout.MinimumSize)

    def setGeometry(self, rect):
        center = 0
        eastWidth = 0
        westWidth = 0
        northHeight = 0
        southHeight = 0
        centerHeight = 0

        QtGui.QLayout.setGeometry(self, rect)

        for wrapper in self.list:
            item = wrapper.item
            position = wrapper.position

            if position == BorderLayout.North:
                item.setGeometry(QtCore.QRect(rect.x(), northHeight, rect.width(), item.sizeHint().height()))

                northHeight += item.geometry().height() + self.spacing()
            elif position == BorderLayout.South:
                item.setGeometry(QtCore.QRect(item.geometry().x(), item.geometry().y(), rect.width(), item.sizeHint().height()))

                southHeight += item.geometry().height() + self.spacing()

                item.setGeometry(QtCore.QRect(rect.x(), rect.y() + rect.height() - southHeight + self.spacing(), item.geometry().width(), item.geometry().height()))
            elif position == BorderLayout.Center:
                center = wrapper

        centerHeight = rect.height() - northHeight - southHeight

        for wrapper in self.list:
            item = wrapper.item
            position = wrapper.position

            if position == BorderLayout.West:
                item.setGeometry(QtCore.QRect(rect.x() + westWidth, northHeight, item.sizeHint().width(), centerHeight))

                westWidth += item.geometry().width() + self.spacing()
            elif position == BorderLayout.East:
                item.setGeometry(QtCore.QRect(item.geometry().x(), item.geometry().y(), item.sizeHint().width(), centerHeight))

                eastWidth += item.geometry().width() + self.spacing()

                item.setGeometry(QtCore.QRect(rect.x() + rect.width() - eastWidth + self.spacing(), northHeight, item.geometry().width(), item.geometry().height()))

        if center:
            center.item.setGeometry(QtCore.QRect(westWidth, northHeight, rect.width() - eastWidth - westWidth, centerHeight))

    def sizeHint(self):
        return self.calculateSize(BorderLayout.SizeHint)

    def takeAt(self, index):
        if index >= 0 and index < len(self.list):
            layoutStruct = self.list.pop(index)
            return layoutStruct.item

        return None

    def add(self, item, position):
        self.list.append(ItemWrapper(item, position))

    def calculateSize(self, sizeType):
        totalSize = QtCore.QSize()

        for wrapper in self.list:
            position = wrapper.position
            itemSize = QtCore.QSize()

            if sizeType == BorderLayout.MinimumSize:
                itemSize = wrapper.item.minimumSize()
            else: # sizeType == BorderLayout.SizeHint
                itemSize = wrapper.item.sizeHint()

            if position == BorderLayout.North or position == BorderLayout.South or position == BorderLayout.Center:
                totalSize.setHeight(totalSize.height() + itemSize.height())

            if position == BorderLayout.West or position == BorderLayout.East or position == BorderLayout.Center:
                totalSize.setWidth(totalSize.width() + itemSize.width())

        return totalSize
MeinWidget.py:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore
import sys

class MeinWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent);

        self.pen = QtGui.QPen(QtGui.QColor(0,0,0));
        self.pen.setWidth(1);
        self.pen.setStyle(QtCore.Qt.DashDotLine);
        self.brush = QtGui.QBrush(QtGui.QColor(255,255,255));        

    def paintEvent(self, event):
        painter = QtGui.QPainter(self);

        painter.setPen(self.pen);
        painter.setBrush(self.brush);
        painter.drawRect(0,0,1,1);
window.py:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui
from BorderLayout import BorderLayout
from MeinWidget import MeinWidget



class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        layout = BorderLayout()

        label = []
        label.append(QtGui.QLabel("westen"))
        label.append(QtGui.QLabel(u"sünden"))
        label.append(QtGui.QLabel("zentral"))
        label.append(QtGui.QLabel("osten"))

        for l in label[:]:
            l.setAlignment(QtCore.Qt.AlignCenter)


        layout.addWidget(label[0], BorderLayout.West)
        layout.addWidget(label[1], BorderLayout.South)
        layout.addWidget(label[2], BorderLayout.Center)
        layout.addWidget(label[3], BorderLayout.East)

        widget = MeinWidget()

        #widget = QtGui.QPushButton("test")
        layout.addWidget(widget, BorderLayout.North);

        self.setLayout(layout)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
jeroen

Verfasst: 2. April 2009 19:44
von jeroen
hi,

ich hab es selbst gelöst,
man muss die Min oder Max Höhe setzen.

jeroen