2016-04-26 13 views
0

私はユーザーがシーンにアイテムを追加できるアプリケーションを作成しています。すでに描画されているアイテムに対して新しいアイテムを描画して、collidesWithItem()関数を使用して衝突を検出することにしました。私のコードでは、明らかに衝突があってもプログラムをデバッグしてもcolliedWithItem()関数が "False"を返し続けても、追加されたアイテムを引き続き描画できます。collidesWithItem()関数が衝突を検出していない(PyQt)

フォームのツールバーをクリックして項目を追加します。ダウン以下

は私のコードです:

class graphicsScene(QtGui.QGraphicsScene, QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(graphicsScene, self).__init__(parent) 
     self.i = 0 
     self.setSceneRect(-180, -90, 360, 180) 
     global overlapped 
     overlapped = 0 

    def mousePressEvent(self, event): 
     global host_cs 
     global overlapped 

     if host_cs == 1: 
      if len(hostItem_list) == 0: 
       self.host_item = host_Object() 
       hostItem_list.append(self.host_item.host_pixItem) 
      else: 
       self.host_item = host_Object() 
       for host in hostItem_list: 
        if self.host_item.host_pixItem.collidesWithItem(host): 
         print 'collision' 
         overlapped = 1 
         break 

        elif self.host_item.host_pixItem.collidesWithItem(host) == False: 
         overlapped = 0 
         if overlapped == 0: 
          hostItem_list.append(self.host_item.host_pixItem) 

    def mouseReleaseEvent(self, event): 
     global host_cs 
     if host_cs == 1: 
      if overlapped == 0: 
       self.addItem(self.host_item.host_pixItem) 
       self.host_item.host_pixItem.setPos(event.scenePos()) 
       self.i += 1 
       host_list.append('h' + str(self.i)) 

class host_Object(QtGui.QGraphicsPixmapItem, QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(host_Object, self).__init__(parent) 
     pixmap = QtGui.QPixmap("host.png") 
     self.host_pixItem = QtGui.QGraphicsPixmapItem(pixmap.scaled(30, 30, QtCore.Qt.KeepAspectRatio)) 
     self.host_pixItem.setFlag(QtGui.QGraphicsPixmapItem.ItemIsSelectable) 
     self.host_pixItem.setFlag(QtGui.QGraphicsPixmapItem.ItemIsMovable) 

class Form(QtGui.QMainWindow, QtGui.QWidget): 
    def __init__(self): 
     super(Form, self).__init__() 
     self.ui = uic.loadUi('form.ui') 

     self.ui.actionHost.triggered.connect(self.place_host) 

     self.scene = graphicsScene() 
     self.ui.view.setScene(self.scene) 

    def place_host(self): 
     host_cs = 1 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    form = Form() 
    form.ui.show() 
    app.exec_() 
+0

'class host_Object(QtGui.QGraphicsPixmapItem、QtGui.QWidget)'それはなんですか?これは禁止されています!あなたはこのように継承することはできません。これはあなたの問題の原因かもしれません。ここでは 'class Form(QtGui.QMainWindow、QtGui.QWidget)'と同じです。 –

答えて

0

多重継承は、アプリケーション設計のすべての悪の源です。 Qtでは二重継承することも禁止されていますQObject。 したがって、複数の継承を持つすべてのクラスには大きな欠陥があります。

class host_Object(QtGui.QGraphicsPixmapItem, QtGui.QWidget)でも、項目はQWidgetQGraphicsItemに同時にできないため、間違って問題があります。

Qtフレームワークだけでなく、どの言語でも、一般的なルールとして二重継承を避けることをお勧めします。

+0

返信いただきありがとうございます、私は2番目の不要な継承を削除しましたが、プログラムはまだ衝突を検出していません。この理由は何でしょうか? – neziy