2016-10-18 34 views
3

我正在使用PyQt中的程序並創建一個窗口小部件,該窗口小部件在該網格上顯示網格和一組多邊形,您可以移動並單擊。當我嘗試實現多邊形的點擊時,它似乎不起作用。下面是不起作用的功能:查找QPolygon是否包含QPoint - 未給出預期結果

def mouseMoveCustom(self, e): 
    for poly in reversed(self.polys): 
     if poly.contains(e.pos()): 
      self.cur_poly = poly 
      self.setCursor(Qt.PointingHandCursor) 
      print('mouse cursor in polygon') 
      break 
     else: 
      self.setCursor(Qt.CrossCursor) 

爲背景,self.polysQPolygonse.pos()列表中鼠標的位置。我曾嘗試進入

print(poly) 
print(poly.contains(QPoint(1,1))) 

,以測試它是否會的控制點的工作,但在控制檯中,只給了我這樣的:

<PySide.QtGui.QPolygon(QPoint(50,350) QPoint(50,0) QPoint(0,0) QPoint(0,350)) at 0x000000000547D608> 
False 

是有什麼我做錯了,或如何將上述「多邊形」轉換爲我可以使用的實際QPolygon

編輯:

這是用來生成列表self.polys代碼:

self.polys.append(QPolygon([QPoint(points[i][X]+self.transform[X], points[i][Y]+self.transform[Y]) for i in range(len(points))])) 

莫非也許是使用內嵌的for循環添加QPolygons到列表中的一個問題?

回答

3

不工作的原因是因爲bool QPolygon.contains(QPoint)如果點是多邊形的一個頂點,或者點落在多邊形的邊上,則返回true。一些將在您的設置中返回true的點的例子是QPoint(0,0),QPoint(0,200),或任何符合這些標準的任何內容。

大概你正在尋找的是一個函數,如果這個點位於多邊形內而不是它上面,它將返回true。您正在尋找的功能是QPolygon.containsPoint (QPoint , Qt.FillRule)。重點是您認爲的那樣,第二個值是1或0(分別表示爲Qt.OddEvenFill或Qt.WindingFill),它決定了查找點是否在多邊形內的方法。關於Qt.FillRule信息可以在這裏找到:https://doc.qt.io/archives/qtjambi-4.5.2_01/com/trolltech/qt/core/Qt.FillRule.html

糾正代碼:

print(poly) 
print(poly.containsPoint(QPoint(1,1), Qt.OddEvenFill)) 
+0

謝謝!我認爲'QPolygon.contains()'在多邊形內找到了一個點,而不僅僅是多邊形的外部頂點。 –

相關問題