2016-12-13 12 views
1

Я написал класс для отображения прямоугольников (класса ячеек). Я хотел бы иметь функции внутри класса для вызова другого класса (т. Е. Вызывая cell.paintEvent(self,event) и cell.drawRectangles(self,qp) в функции, определенной в классе Window). К сожалению, я не знаю, как назвать эти функции в другом классе (например, Window), поскольку они оба требуют аргументы (то есть event и pq), и я не знаю, что им передать.Вызов paintEvent() из класса в pyqt4 python

Вот код для моего класса клеток:

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 

Чтобы инициализировать ячейку, вам просто нужно сделать

newCell = cell(args_here) 

или сделать newCell как часть self (Window)

self.newCell = cell(args_here) 

Для методы вызова в объекте ячейки довольно просты.

self.newCell.paintEvent(args_here) 
+0

На самом деле весь код в одном файле. Я уже определил объект ячейки (т. Е. Test = cell (a, b, c, ....)), а затем попробовал test.paintEvent() в initiate(). Но мне подсказывают, что paintEvent() нуждается в аргументе, и он не работает. Я не знаю, что делать, когда я должен передать ему аргумент «событие». Я определил функцию - это класс ячейки, называемый def pr (self), который будет печатать только строку. Я мог бы легко вызвать эту функцию (т. Е. Test.pr(), напечатать строку). Возможно, если paintEvent был пустым, я мог бы просто сказать test.paintEvent(), и он нарисовал бы форму для меня. –

+0

@Jamycodes хорошо, если у вас есть функция под названием 'pr', а затем передайте аргумент события' pr' как 'cell.paintEvent (cell.pr)'. Но из вашего кода, вышедшего выше, я не вижу, где используется 'e' в' paintEvent (self, e) '. –

+0

Это хороший момент. Я тоже не вижу этого. Я беру на себя инициативу из этого примера, который использует те же функции, но не имеет в классе объектов, как я. Я не вижу, где вводится «e» в качестве аргумента в функции: Вот ссылка: [http://zetcode.com/gui/pyqt4/drawing/] –