2016-12-13 3 views
1

사각형 (셀 클래스)을 표시하는 클래스를 작성했습니다. 다른 클래스를 호출하기 위해 클래스 내부의 함수를 사용하고 싶습니다 (예 : Window 클래스에 정의 된 함수에서 cell.paintEvent(self,event)cell.drawRectangles(self,qp) 호출). 불행히도 다른 클래스 (예 : Window)에서이 함수를 호출하는 방법을 모르겠습니다. 즉, 둘 다 인수 (예 : eventpq)가 필요하며 전달할 항목을 모르겠습니다. 여기에 pyqt4 python의 클래스에서 paintEvent() 호출

class cell(object): 
    def __init__(self, c, x, y, w, h, active,flux_val,index): 

     self.c1 = c 
     self.c2 = c 
     self.c3 = 255 
     self.x = x 
     self.y = y 
     self.w = w 
     self.h = h 
     self.index = index 
     self.active = active 
     self.flux_val = flux_val 
     self.isChecked = False 
     self.isHit = False 

    def paintEvent(self, e): 

     qp = QtGui.QPainter() 
     qp.begin(self) 
     self.drawRectangles(qp) 
     qp.end() 

    def drawRectangles(self, qp): 

     color = self.c2 
     #qp.setPen(color) 

     qp.setBrush(color) 
     qp.drawRect(self.x, self.y, self.w, self.h) 

내가 (내가 할 쉽게 수) 세포 객체의 배열을 인스턴스화 할 코드 (특히 def.initiate(self))의 일부이며 : 여기

는 내 휴대 클래스에 대한 코드 (나는 아직도 할 방법을 생각하지 않은, 즉 cell.paintEvent(self,event)cell.drawRectangles(self,qp))의 관련 표시 함수를 호출 :

import sys 
from PyQt4 import QtGui, QtCore 
import numpy as np 


class Window(QtGui.QMainWindow): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.setGeometry(50, 50, 1000, 800) 
     self.setWindowTitle("PyQT tuts!") 
     self.initiate() 
     self.show() 

    def initiate(self): 
     #initiate an array of cell objects 
     #Call their display functions (or any other relevant class functions) 

답변

1

paintEvent 메서드는 QWidget에서 상속 한 클래스로 덮어 써야합니다. drawRectangles 함수를 구현할 수 있지만 paintEvent에서 호출해야합니다.

import sys 
from PyQt4 import QtGui, QtCore 


class cell(object): 
    def __init__(self, c, x, y, w, h): 
     self.color = c 
     self.x = x 
     self.y = y 
     self.w = w 
     self.h = h 

    def drawRectangles(self, qp): 
     qp.setBrush(self.color) 
     qp.drawRect(self.x, self.y, self.w, self.h) 


class Window(QtGui.QMainWindow): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.setGeometry(50, 50, 1000, 800) 
     self.setWindowTitle("PyQT tuts!") 
     self.cells = [] 

     now = QtCore.QTime.currentTime() 
     QtCore.qsrand(now.msec()) 
     self.createCells() 

    def createCells(self): 
     for i in range(100): 
      self.cells.append(cell(QtGui.QColor(QtCore.qrand() % 256, 
               QtCore.qrand() % 256, 
               QtCore.qrand() % 256), 
            QtCore.qrand() % self.width(), QtCore.qrand() % self.height(), 
            QtCore.qrand() % 40, QtCore.qrand() % 40)) 
     self.update() 

    def paintEvent(self, e): 
     qp = QtGui.QPainter(self) 
     for c in self.cells: 
      c.drawRectangles(qp) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    w = Window() 
    w.show() 
    sys.exit(app.exec_()) 

enter image description here

-1

글쎄, 당신은 셀 개체를 가져올 필요가있다. 그에게 당신이 셀을 초기화하려면

from yourFileNameWithCellObject import cell 

필요, 당신은 단순히

self.newCell = cell(args_here) 

으로

newCell = cell(args_here) 

을하거나 self (윈도우)의 일부로서 newCell을해야 셀 객체의 메서드 호출은 매우 간단합니다.

self.newCell.paintEvent(args_here) 
+0

사실 모든 코드는 하나 개의 파일에 있습니다. 셀 객체 (예 : test = cell (a, b, c, ....))를 정의한 다음 initiate()에서 test.paintEvent()를 시도했습니다. 그러나 paintEvent()에 인수가 필요하며 작동하지 않는다는 메시지가 표시됩니다. 나는 그것을 '사건'주장에 전달해야 할 때 무엇을해야할지 모른다. 내가 정의한 함수는 def pr (self)라는 셀 클래스이다.이 클래스는 문자열 만 출력 할 뿐이다. 그 함수를 쉽게 호출 할 수 있습니다 (즉, test.pr()은 문자열을 인쇄합니다). 아마도 paintEvent가 void 인 경우 test.paintEvent()라고 말하면 모양을 그릴 수 있습니다. –

+0

@Jamycodes 만약 당신이'pr'이라는 함수를 가지고 있다면'cell.paintEvent (cell.pr)'처럼'pr' 이벤트 인수를 넘겨 주면됩니다. 그러나 위에 게시 된 코드에서 'paintEvent (self, e)'의 'e'가 어디에 사용되는지는 알 수 없습니다. –

+0

좋은 지적입니다. 나는 그것을 볼 수 없다. 동일한 함수를 사용하지만 나 같은 객체 클래스에는없는이 예제에서 필자의 주도권을 잡았다. 함수에서 인수로 "e"가 입력 된 곳을 볼 수 없습니다. 여기 링크 : [http://zetcode.com/gui/pyqt4/drawing/] –