2011-04-25 6 views
1

그래서 프레임리스 QDialog를 클릭하고 드래그하여 간단히 이동할 수 있기를 원합니다. 아래 코드가 주어지면 대화 상자를 드래그하면 항상 대화 상자의 가장 왼쪽 상단 (0,0)이 마우스로 스냅됩니다. 어떻게하면 이것을 피할 수 있을까요, 아니면 수학이 그걸 위해 무엇을 할 수 있을까요? 다음과 같은 기본 서브 클래스와Frameless QDialog를 MouseMoveEvent로 이동

표준 인 QDialog가 :

대신 event.pos의
class Main(QtGui.QDialog): 
    def __init__(self, args): 
     QtGui.QDialog.__init__(self) 

    def mouseMoveEvent(self, event): 
     super(Main, self).mouseMoveEvent(event) 
     if self.leftClick == True: self.moveWindow(event.globalPos()) 

    def mousePressEvent(self, event): 
     super(Main, self).mousePressEvent(event) 
     if event.button() == QtCore.Qt.LeftButton: 
      self.leftClick = True 

    def mouseReleaseEvent(self, event): 
     super(Main, self).mouseReleaseEvent(event) 
     self.leftClick = False 

답변

1

()를 호출 event.globalPos 시도(). QMouseEvent 참조에서 "마우스 이벤트의 결과로 위젯을 이동하면 흔들리는 것을 피하기 위해 globalPos()가 반환하는 전역 위치를 사용하십시오."

+0

우수! 그게 효과가있어, 지금까지 내가 어디에 있는지 보여주기 위해 위의 코드를 업데이트했다. 이제 대화 상자를 왼쪽 마우스로 클릭하여 드래그하면 대화 상자의 왼쪽 상단이 마우스에 스냅 될 때마다 대화 상자와 관련하여 마우스를 잡을 수 있어야합니다. – Cryptite

+0

그 문제를 해결 했습니까? 내 마우스도 대화 상자의 왼쪽 상단에 스냅합니다. 나는 그것을 제거 할 수 없습니다. – apelliciari

+0

아니요, 아직 없습니다, 지금 막 고집했습니다. 바라건대 누군가가 찾아와 도와 줄 수 있기를 바랍니다. – Cryptite

2

제안 된 솔루션 이동 창, 마우스 커서가 0,0으로 이동합니다. 나는 마우스 커서가 윈도우의 x, y에 항상 머물길 원했다. "마스크"틀 윈도우가 조금 작기 때문에,

X=0 
X2=8 #!!!! 
Y=0 
Y2=30 #!!!! 
class Main(QtWidgets.QMainWindow): 
    leftClick = False #! IMPORTANT 

    def __init__(self, parent=None): 
     QtWidgets.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

    def mouseMoveEvent(self, event): 
     super(Main, self).mouseMoveEvent(event) 
     if self.leftClick == True: 
      self.move(event.globalPos().x()-X-X2,event.globalPos().y()-Y-Y2) 

    def mousePressEvent(self, event): 
     super(Main, self).mousePressEvent(event) 
     if event.button() == QtCore.Qt.LeftButton: 
      self.leftClick = True 
      global X,Y 
      X=event.pos().x() 
      Y=event.pos().y() 

    def mouseReleaseEvent(self, event): 
     super(Main, self).mouseReleaseEvent(event) 
     self.leftClick = False 

(window.setMask()로 만든) 프레임리스 윈도우 내가 X2 및 Y2 같은 몇 가지 상수 필요를 들면 다음과 같습니다

는 [QT5에서] 코드의 버전을 업그레이드 진짜 프레임 창보다. 이 차이를 계산하는 방법을 아직 모릅니다.

UP. 오래 동안 한 가지 치명적인 버그를 발견했습니다. 임의의 푸시 버튼 (응용 프로그램 시작 직후)에서 마우스 왼쪽 버튼을 누르고 푸시 버튼에서 마우스 커서를 드래그하면 응용 프로그램이 중단됩니다. 존재하지 않는 변수 LeftClick을 참조하기 때문입니다. 그래서 Main 클래스에서 LeftClick을 생성해야합니다.