Marius Valentavicius
Marius Valentavicius

Reputation: 133

Custom QWidget: setGeometry not working

My problem is self.spdBar.setGeometry not working for imported widget, please can someone explain what I doing wrong?

here is the main.py code:

from PyQt4 import QtGui, QtCore
import sys
from src.cprg import cPrg

class mainWindow(QtGui.QWidget):
    def __init__(self):

        self.spdBar = cPrg()

        super(mainWindow, self).__init__()

        self.initUi()

    def initUi(self):

        self.spdBar.setGeometry(10,10,10,10)
        self.spdBar.setValue(.5)
        # self.showFullScreen()
        self.setGeometry(100, 100, 800, 480)
        self.setWindowTitle('Window Title')

        self.show()

    def close_app(self):
        sys.exit()

def main():
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)
    app = QtGui.QApplication(sys.argv)
    gui = mainWindow()
    gui.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

here is custom widget py file:

from PyQt4 import QtGui, QtCore
from PyQt4.Qt import QPen

class cPrg(QtGui.QWidget):
    def __init__(self):
        super(cPrg, self).__init__()

        self.lineWidth = 0
        self.setValue(0.0)

    def setValue(self, val):
        val = float(min(max(val, 0), 1))
        self._value = -270 * val
        self.update()

    def setLineWidth(self, lineWidth):
        self.lineWidth = lineWidth

    def paintEvent(self, e):
        painter = QtGui.QPainter(self)
        painter.setRenderHint(painter.Antialiasing)

        #outerRadius = min(self.width()/2, self.height()/2)

        r = QtCore.QRect(15,15,300,300)  #<-- create rectangle

        startAngle = 270 * 16  # <-- set start angle to draw arc
        endAngle = -270 * 16  # <-- set end arc angle

        painter.setPen(QPen(QtGui.QColor('#000000'), 3)) # self.lineWidth))  # <-- arc color
        # painter.setBrush(QtCore.Qt.HorPattern)
        painter.drawArc(r, startAngle, endAngle)  # <-- draw arc

        # arc prg
        painter.save()
        painter.setPen(QPen(QtGui.QColor('#ffffff'), 30))
        painter.drawArc(r, startAngle, self._value * 16)
        painter.restore()

        painter.end()
        super(cPrg, self).paintEvent(e)

My guess that something wrong in paintEvent function.

UPDATE:

from PyQt4 import QtGui, QtCore
from PyQt4.Qt import QPen


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

        self.lineWidth = 0
        self.setValue(0.0)


    def setValue(self, val):
        val = float(min(max(val, 0), 1))
        self._value = -270 * val
        self.update()


    def setLineWidth(self, lineWidth):
        self.lineWidth = lineWidth


    def paintEvent(self, e):
        painter = QtGui.QPainter(self)
        painter.setRenderHint(painter.Antialiasing)

        # outerRadius = min(self.width()/2, self.height()/2)

        r = QtCore.QRect(1, 1, 100, 100)  # <-- create rectangle

        startAngle = 270 * 16  # <-- set start angle to draw arc
        endAngle = -270 * 16  # <-- set end arc angle

        painter.setPen(QPen(QtGui.QColor('#000000'), 3))  # self.lineWidth))  # <-- arc color
        # painter.setBrush(QtCore.Qt.HorPattern)
        painter.drawArc(r, startAngle, endAngle)  # <-- draw arc

        # arc prg
        painter.save()
        painter.setPen(QPen(QtGui.QColor('#ffffff'), 30))
        painter.drawArc(r, startAngle, self._value * 16)
        painter.restore()

        painter.end()
        super(cPrg, self).paintEvent(e)


class mainWindow(QtGui.QWidget):
    def __init__(self):
        super(mainWindow, self).__init__()

        self.spdBar = cPrg(self)

        self.initUi()

    def initUi(self):
        self.spdBar.setGeometry(10, 10, 500, 500)
        self.spdBar.setValue(.5)

        # self.hbox = QtGui.QHBoxLayout(self)
        # self.hbox.addWidget(self.spdBar)

        # self.showFullScreen()
        self.setGeometry(100, 100, 800, 480)
        self.setWindowTitle('Window Title')

        # self.show()

        # def close_app(self):
        #    sys.exit()

OUTPUT

EDIT: with this code working:

    rect = e.rect()
    r = QtCore.QRect(rect)
    size = r.size()
    pos = r.center()
    r.moveCenter( QtCore.QPoint(pos.x(), pos.y()) )
    r.setSize(size*.9)
    r.moveCenter(pos)

Upvotes: 0

Views: 1645

Answers (1)

eyllanesc
eyllanesc

Reputation: 243897

You must change the following:

  • Add parent to cPrg
  • If r = QtCore.QRect(15, 15, 300, 300) then setGeometry(rect) must be bigger.

My solution is:

import sys
from PyQt4 import QtCore, QtGui


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

        self.lineWidth = 0
        self.setValue(0.0)

    def setValue(self, val):
        val = float(min(max(val, 0), 1))
        self._value = -270 * val
        self.update()

    def setLineWidth(self, lineWidth):
        self.lineWidth = lineWidth

    def paintEvent(self, e):
        painter = QtGui.QPainter(self)
        painter.setRenderHint(painter.Antialiasing)

        # outerRadius = min(self.width()/2, self.height()/2)

        r = QtCore.QRect(15, 15, 300, 300)  # <-- create rectangle

        startAngle = 270 * 16  # <-- set start angle to draw arc
        endAngle = -270 * 16  # <-- set end arc angle

        painter.setPen(QtGui.QPen(QtGui.QColor('#000000'), 3))  # self.lineWidth))  # <-- arc color
        # painter.setBrush(QtCore.Qt.HorPattern)
        painter.drawArc(r, startAngle, endAngle)  # <-- draw arc

        # arc prg
        painter.save()
        painter.setPen(QtGui.QPen(QtGui.QColor('#ffffff'), 30))
        painter.drawArc(r, startAngle, self._value * 16)
        painter.restore()

        painter.end()
        super(cPrg, self).paintEvent(e)


class mainWindow(QtGui.QWidget):
    def __init__(self):
        super(mainWindow, self).__init__()
        self.spdBar = cPrg(self)
        self.initUi()

    def initUi(self):
        self.spdBar.setGeometry(10, 10, 300, 300)
        self.spdBar.setValue(.5)
        # self.showFullScreen()
        self.setGeometry(100, 100, 800, 480)
        self.setWindowTitle('Window Title')


def main():
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)
    app = QtGui.QApplication(sys.argv)
    gui = mainWindow()
    gui.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

enter image description here

Upvotes: 1

Related Questions