2016-12-13 5 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関数(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/] –

関連する問題