2016-12-16 8 views
1

円弧を描こうとすると問題があります。私は、別のpyファイルから関数pyを描画し、これまでのところ運がないようにしたいです(メインpyファイルの描画関数ならOKです)。別のpyファイルをインポートしましたが、何も起こりません。 main.pypyqt4他のpyファイルから円弧を描く

from PyQt4 import QtGui, Qt, QtCore 
import sys 
from src.cPrg import cPrg 
from PyQt4.Qt import QPen 

class mainWindow(QtGui.QWidget): 

def __init__(self): 

    super(mainWindow, self).__init__() 

    self.otherFile = cPrg() 

    self.initUI() 



def initUI(self): 

    #self.exitBtn = QtGui.QPushButton('Exit', self) 
    #self.exitBtn.setGeometry(100,100,60,40) 
    #self.exitBtn.clicked.connect(self.close_app) 

    self.label = QtGui.QLabel(self) 
    self.label.setText(self.otherFile.textas) 
    self.label.setGeometry(100,140, 60, 40) 

    self.otherFile.setGeometry(20,20, 20,20) 
    self.otherFile.startA = 270 
    self.otherFile.endA = -270 


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

    self.show() 

def close_app(self): 
    sys.exit() 



def main(): 
    app = QtGui.QApplication(sys.argv) 
    gui = mainWindow() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

とanotherfile.py

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

class cPrg(QtGui.QWidget): 

def __init__(self): 

    super(cPrg, self).__init__() 

    self.startA = 0 
    self.endA = 0 
    self.textas = 'bandom' 

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

    r = QtCore.QRect(200,200,20,20)       #<-- create rectangle 
    size = r.size()           #<-- get rectangle size 
    r.setSize(size*10)           #<-- set size 
    startAngle = self.startA*16        #<-- set start angle to draw arc 
    endAngle = self.endA*16         #<-- set end arc angle 

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


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

私が間違って何を、どのように私は変更することができ、線幅:ここでのコードはありますか?私はメインのPYファイルで行われたすべての絵、ここでのコードは次のとおりです:

from PyQt4 import QtGui, Qt, QtCore 
import sys 
from src.cprg import cPrg 
from src.cprogress import GaugeWidget 
from PyQt4.Qt import QPen 

class mainWindow(QtGui.QWidget): 

def __init__(self): 

    self.otherFile = cPrg() 
    self.gauge = GaugeWidget() 

    self.i = 0 
    self.lineWidth = 3 
    self._value = 0 
    self.completed = 0 

    super(mainWindow, self).__init__() 

    self.initUI() 

def initUI(self): 

    self.setValue(.5) 

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

    self.show() 

def close_app(self): 
    sys.exit() 

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) 
    rect = e.rect 

    outerRadius = min(self.width(),self.height()) 
    #arc line 
    r = QtCore.QRect(20,20,outerRadius-10,outerRadius-10)       #<-- create rectangle 
    size = r.size()           #<-- get rectangle size 
    r.setSize(size*.4)           #<-- set size 
    startAngle = 270*16        #<-- set start angle to draw arc 
    endAngle = -270*16         #<-- set end arc angle 

    painter.setPen(QPen(QtGui.QColor('#000000'), 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'), 20)) 
    painter.drawArc(r, startAngle, self._value*16) 
    painter.restore() 

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

def main(): 
app = QtGui.QApplication(sys.argv) 
gui = mainWindow() 
sys.exit(app.exec_()) 

if __name__ == '__main__': 
main() 

これは私の単純な円形プログレスバーで、今の質問は、私はsetValueの、setlineWidthとpaintEventを置くことができる方法である は

EDITはありがとうこれらの関数を使ってこのファイルとクラスをインポートするだけで呼び出すことができますか?私はこれを試しました:

from PyQt4 import QtGui, Qt, QtCore 
import sys 
from src.cprg import cPrg    #<import progressbar 
from src.cprogress import GaugeWidget 
from PyQt4.Qt import QPen 

class mainWindow(QtGui.QWidget): 

def __init__(self): 

    self.otherFile = cPrg()   #< imported progress bar 
    self.gauge = GaugeWidget() 

    self.i = 0 
    self.lineWidth = 3 
    self._value = 0 
    self.completed = 0 

    super(mainWindow, self).__init__() 

    self.initUI() 

def initUI(self): 

    self.otherFile.setGeometry(10,10,100,100) #<<<< progress bar size 
    self.otherFile.setValue(0.5)    #< progress bar value 

これは動作しません。

+0

を、あなたのロジックは非常に間違っています。 – eyllanesc

+0

@eyllanesc私はcPrg.pyファイルとmain.pyファイルで単純な呼び出しcPrgを描画し、サイズのためにsetGeometryを取得したいと考えています。 –

+0

@eyllanescなぜロジックが間違っていますか?私は例があります - 別のファイルで循環進行状況バーを持って、私はメインファイルでこのプログレスバーを呼び出して、それは働いています(paintEventはプログレスバーのpyファイルです)。私はpythonとpyqtの新機能も知っているので、この場合は間違ったロジックについてもっと知りたいと思う。ありがとうございます –

答えて

1

QPen(color, line_width)で線幅を変更し、update() paintEventで再描画します。

これを試してみてください。

from PyQt4 import QtGui, QtCore 


class cPrg: 
    def __init__(self): 
     self.linewidth = 0 

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

    def drawArc(self, painter): 
     painter.setRenderHint(painter.Antialiasing) 
     r = QtCore.QRect(200,200,20,20)       #<-- create rectangle 
     size = r.size()           #<-- get rectangle size 
     r.setSize(size*10)           #<-- set size 
     startAngle = self.startA*16        #<-- set start angle to draw arc 
     endAngle = self.endA*16         #<-- set end arc angle 
     painter.setPen(QtGui.QPen(QtGui.QColor('#000000'), self.linewidth))    #<-- arc color 
     painter.drawArc(r, startAngle, endAngle)     #<-- draw arc 


class mainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(mainWindow, self).__init__() 
     self.otherFile = cPrg() 
     self.initUI() 
     self.i = 0 

    def initUI(self): 
     self.label = QtGui.QLabel(self) 
     self.label.setText(self.otherFile.textas) 
     self.label.setGeometry(100,140, 60, 40) 
     self.otherFile.startA = 270 
     self.otherFile.endA = -270 
     self.setGeometry(100, 100, 800, 480) 
     self.setWindowTitle('Window Title') 
     timer = QtCore.QTimer(self) 
     timer.timeout.connect(self.changeLineWidth) 
     timer.start(1000) 

    def changeLineWidth(self): 
     self.otherFile.setLineWidth(self.i) 
     self.i += 1 
     self.i %= 60 
     self.update() 

    def paintEvent(self, e): 
     painter = QtGui.QPainter(self) 
     self.otherFile.drawArc(painter) 


if __name__ == '__main__': 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    w = mainWindow() 
    w.show() 
    sys.exit(app.exec_()) 

あなたは、円形のプログレスバーをしたい場合は、あなたがQProgressbarオーバーライドしなければなりません:?あなたが得ることを期待しない何

from math import ceil 

from PyQt4 import QtGui, Qt, QtCore 
import sys 


class cPrg(QtGui.QProgressBar): 

    def __init__(self, parent=None): 
     super(cPrg, self).__init__(parent) 
     self.linewidth = 1 

    def factor(self, value): 
     a = 360/(self.maximum() - self.minimum()) 
     b = -a/(self.maximum() - self.minimum()) 
     return a*value + b 

    def setLineWidth(self, linewidth): 
     self.linewidth = linewidth 
     self.update() 

    def paintEvent(self, event): 

     painter = QtGui.QPainter(self) 
     painter.setRenderHint(painter.Antialiasing) 
     r = self.rect() 
     val = ceil(self.factor(self.value())) 
     nr = QtCore.QRect(r.topLeft() + QtCore.QPoint(self.linewidth, self.linewidth), 
        QtCore.QSize(r.width()-2*self.linewidth, r.height()-2*self.linewidth)) 
     painter.setPen(QtGui.QPen(QtGui.QColor('#000000'), self.linewidth)) 
     painter.drawArc(nr, 0*16, val*16) 


class mainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(mainWindow, self).__init__() 
     self.otherFile = cPrg(self) 
     self.otherFile.setMinimum(0) 
     self.otherFile.setMaximum(360) 
     self.otherFile.setValue(90) 
     self.initUI() 

     timerLW = QtCore.QTimer(self) 
     timerLW.timeout.connect(self.changeLW) 
     timerLW.start(100) 

     timerVal = QtCore.QTimer(self) 
     timerVal.timeout.connect(self.updateValue) 
     timerVal.start(100) 

    def initUI(self): 
     self.label = QtGui.QLabel(self) 
     self.label.setText("test") 
     self.label.setGeometry(200, 200, 60, 40) 

     self.otherFile.setGeometry(0, 0, 200, 200) 
     self.setGeometry(0, 0, 800, 480) 
     self.setWindowTitle('Window Title') 

    def changeLW(self): 
     lw = (self.otherFile.linewidth + 1) % 20 
     self.otherFile.setLineWidth(lw) 

    def updateValue(self): 
     self.otherFile.setValue(self.otherFile.value() + 1) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    gui = mainWindow() 
    gui.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

enter image description here enter image description here

+0

これは動作していますが、これは動作していますが、cPrg.pyファイルとmain.pyファイルのこのような作図は、再描画せずにcPrgを呼び出すことができます。 –

+0

ありがとうございます!どこに私が円形のプログレスバーの例を探し始めたのですか? :)今私は自分自身でそれを行うことを学びたいと思うし、私のアークはsetGeometryでサイズを作ることができないプログレスバーのように見える。とにかくありがとうございました!ちなみに –

+0

あなたは私の進捗バーのサイズbu setGeometryを設定できる理由を教えていただけますか? –

関連する問題