【问题标题】:pyqt4 drawing arc from other py filepyqt4从其他py文件中绘制圆弧
【发布时间】:2016-12-16 19:42:27
【问题描述】:

尝试绘制弧线,问题是我想从另一个 py 文件中调用绘制函数,但到目前为止没有运气(如果在主 py 文件中绘制函数就可以了)。我导入了另一个 py 文件,但没有任何反应。这是代码: main.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() 

还有另一个文件.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 函数放入单独的 py 文件中,然后通过导入这个文件和具有这些函数的类来调用?我试过这个:

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 

这不起作用。

【问题讨论】:

  • 你期望得到什么?,你的逻辑非常错误。
  • @eyllanesc 我想在 cPrg.py 文件和 main.py 文件中进行绘制,只需简单地调用 cPrg 和 setGeometry 即可。
  • @eyllanesc 为什么逻辑错误?我有一个例子 - 在单独的文件中有圆形进度条,我在主文件中调用这个进度条并且它正在工作(paintEvent 正在进行进度条 py 文件)。我知道我也是 python 和 pyqt 的新手,所以想更多地了解这种情况下的错误逻辑。谢谢
  • 放置你想要的东西总是好的。使用此请求更新您的帖子
  • @eyllanesc 刚刚更新了我的帖子。

标签: python python-2.7 pyqt pyqt4


【解决方案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()

【讨论】:

  • 感谢您的回答,这是可行的,但可能在 cPrg.py 文件和 main.py 文件中制作像这样的绘图制作,只需调用 cPrg 而不重绘?
  • 谢谢!当我开始寻找圆形进度条示例时,您在哪里? :) 现在我想学习自己做,我的弧看起来(并且表现得像)进度条只是无法通过 setGeometry 确定大小。无论如何,谢谢!
  • 对了,你能告诉我为什么我可以设置我的进度条大小 bu setGeometry?
  • 所有小部件都继承自QWidget
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多