Blaine
Blaine

Reputation: 677

Implementing a Canvas in PyQt5

I have been trying to learn to using PyQt5.

I want to implement a canvas below the "Menu Bar"

class gui(QDialog):
    def __init__(self, parent=None):
        super(gui, self).__init__(parent)
        self.createTopLayout()
        self.painter = canvas(self)
        mainLayout = QGridLayout()
        mainLayout.addLayout(self.topLayout, 0, 0, 1, 2)
        mainLayout.addWidget(self.painter, 1, 0, 6, 2)
        self.setLayout(mainLayout)

    def createTopLayout(self):
        self.topLayout = QHBoxLayout()
        button1 = QPushButton("b1")
        button2 = QPushButton("b2")
        button3 = QPushButton("b3")
        styleComboBox = QComboBox()
        styleComboBox.addItems(QStyleFactory.keys())
        styleLabel = QLabel("&Style:")
        styleLabel.setBuddy(styleComboBox)
        self.topLayout.addWidget(styleLabel)
        self.topLayout.addWidget(styleComboBox)
        self.topLayout.addStretch(1)
        self.topLayout.addWidget(button1)
        self.topLayout.addWidget(button2)
        self.topLayout.addWidget(button3)

Where my canvas is defined as

class canvas(QMainWindow):
    def __init__(self, parent=None):
        super(canvas, self).__init__(parent)
        self.setGeometry(100, 100, 1000, 700)

    def paintEvent(self, e):
        cir = circle() #circle class creates a circle with random center and radius both between 0 to 100
        painter = QPainter(self)
        painter.setPen(QPen(Qt.red, 1, Qt.SolidLine))
        painter.drawEllipse(self, cir.center.x, cir.center.y, cir.radius, cir.radius)

but for me canvas doesnt render at all let alone the ellipse.

Upvotes: 1

Views: 3515

Answers (1)

eyllanesc
eyllanesc

Reputation: 244301

You should not use QMainWindow as a canvas, instead use a QWidget. On the other hand setGeometry will not work if you use layout since the latter handles the geometry, instead it establishes a fixed size and adequate margins. On the other hand it is recommended that the name of the classes begin with capital letters, considering the above the solution is:

class Canvas(QWidget):
    def __init__(self, parent=None):
        super(Canvas, self).__init__(parent)
        self.setFixedSize(1000, 700)
        self.setContentsMargins(100, 100, 100, 100)

    def paintEvent(self, e):
        # ...

Upvotes: 2

Related Questions