2016-12-18 3 views
0

Моя проблема - self.spdBar.setGeometry не работает для импортированного виджета, пожалуйста, кто-нибудь может объяснить, что я делаю неправильно?Пользовательский QWidget: setGeometry не работает

здесь код main.py:

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() 

здесь пользовательский виджет пй файла:

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) 

Мое предположение, что что-то не так в функции paintEvent.

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: с этим кодом работы:

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) 

ответ

1

Вы должны изменить следующее:

  • Добавить parent до cPrg
  • Если r = QtCore.QRect(15, 15, 300, 300), то setGeometry(rect) должно быть больше.

Мое решение:

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

+0

Я сделал то, что вы показали, но до сих пор не работает для меня ... –

+0

пожалуйста, покажите мне ваш обновленный код – eyllanesc

+0

удалить self.show() def close_app (self): sys.exit() – eyllanesc

Смежные вопросы