2017-05-14 3 views
0

マウスで画像を変更したい。だから、どこかをクリックするたびに、イメージが変わるはずです。画像を1回だけ表示できます。だから私は、画像を表示するために必要なすべての初期化を、画像を構築する責任があるコードの部分から分離する必要があります。ここでQWidget内に既に設定されて表示されているQImageを変更するには?

は、私がこれまで

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import pyqtSlot 

class Example(QWidget): 



    def __init__(self): 
     super(Example, self).__init__() 
     self.gx=1 
     self.gy=1 
     self.tlb=QLabel() 
     self.lbl=QLabel() 
     self.image = QImage(512, 512, QImage.Format_RGB32) 
     self.hbox = QHBoxLayout() 
     self.pixmap = QPixmap() 
     self.initUI() 

    def mousePressEvent(self, QMouseEvent): 
     px = QMouseEvent.pos().x() 
     py = QMouseEvent.pos().y() 

     size = self.frameSize() 

     self.gx = px-size.width()/2 
     self.gy = py-size.height()/2 

     self.fillImage() 


    def initUI(self):  
     self.hbox = QHBoxLayout(self) 
     self.pixmap = QPixmap() 

     size = self.frameSize() 

     self.fillImage() 

     self.lbl = QLabel(self) 
     self.lbl.setPixmap(self.pixmap) 

     self.hbox.addWidget(self.lbl) 
     self.setLayout(self.hbox) 

     self.move(300, 200) 
     self.setWindowTitle('Red Rock') 

     self.tlb = QLabel(str(self.gx)+" : "+str(self.gy), self) 
     self.tlb.move(12,3) 
     self.show() 

    def fillImage(self): 
     for x in range(0, 512): 
      t = -1+(x/512)*2 
      color = (1 - (3 - 2*abs(t))*t**2) 

      for y in range(0, 512): 

       t1 = -1+(y/512)*2 
       color1 = (1 - (3 - 2*abs(t1))*t1**2) 
       result = (255/2)+(color * color1 * (t*self.gx+t1*self.gy))*(255/2) 

       self.image.setPixel(x, y, qRgb(result, result, result)) 

     self.pixmap = self.pixmap.fromImage(self.image) 

     self.tlb = QLabel(str(self.gx)+" : "+str(self.gy), self) 

     print(self.gx) 

     self.update() 


def main(): 

    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main()  

print(self.gx)を持っているものですself.gxが変更されたことを私に示しているが、画像が全く変更されません。

どうすればいいですか?

答えて

0

GUIにイメージを更新する必要があることを伝える必要があります。

QTでは、ウィジェットのupdate()またはrepaint()メソッドを呼び出す必要があるようです。

+0

のように見える私はすでに(self.repaintを呼び出すために試してみました)および/またはself.update()を使用すると、画像の補充が終了しましたが、助けになりませんでした。 – user2686299

+0

pixmapで呼び出す必要がありますか?ドキュメントをチェックする... –

0

私はself.repaint()self.update()fillImageself.lbl.setPixmap(self.pixmap)を追加しましたし、今では動作しますが、その後、私は、コードを少し変更し、今ではこの

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import pyqtSlot 

class Example(QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 
     self.gx=1 
     self.gy=1 
     self.lbl=QLabel() 
     self.tlb = None 
     self.image = QImage(512, 512, QImage.Format_RGB32) 
     self.hbox = QHBoxLayout() 
     self.pixmap = QPixmap() 
     self.length = 1 
     self.initUI() 

    def mousePressEvent(self, QMouseEvent): 
     px = QMouseEvent.pos().x() 
     py = QMouseEvent.pos().y() 

     size = self.frameSize() 

     self.gx = px-size.width()/2 
     self.gy = py-size.height()/2 

     h = (self.gx**2+self.gy**2)**0.5 

     self.gx/=h 
     self.gy/=h 

     self.gx*=self.length 
     self.gy*=self.length 

     self.fillImage() 

    def wheelEvent(self,event): 
     self.length+=(event.delta()*0.001) 
     print(self.length) 


    def initUI(self):  
     self.hbox = QHBoxLayout(self) 
     self.pixmap = QPixmap() 
     self.move(300, 200) 
     self.setWindowTitle('Red Rock') 

     self.addedWidget = None 

     self.fillImage() 

     self.setLayout(self.hbox) 

     self.show() 

    def fillImage(self): 
     for x in range(0, 512): 
      t = -1+(x/512)*2 
      color = (1 - (3 - 2*abs(t))*t**2) 

      for y in range(0, 512): 

       t1 = -1+(y/512)*2 
       color1 = (1 - (3 - 2*abs(t1))*t1**2) 
       result = (255/2)+(color * color1 * (t*self.gx+t1*self.gy))*(255/2) 

       self.image.setPixel(x, y, qRgb(result, result, result)) 


     self.pixmap = self.pixmap.fromImage(self.image) 

     if self.lbl == None: 
      self.lbl = QLabel(self) 
     else: 
      self.lbl.setPixmap(self.pixmap) 

     if self.addedWidget == None: 
      self.hbox.addWidget(self.lbl) 
      self.addedWidget = True 

     if self.tlb==None: 
      self.tlb = QLabel(str(self.gx)+" : "+str(self.gy), self) 
      self.tlb.move(12,3) 
     else: 
      self.tlb.setText(str(self.gx)+" : "+str(self.gy)) 

     self.repaint() 
     self.update() 


def main(): 

    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main()  
関連する問題