2016-12-18 1 views
1

matrapotlib 그래프를 FigureurCanvas로 설정 한 다음 FigureurCanvas를 내 AppWindow에 추가하는 앱이 있습니다. 그리드가 드래그 가능하도록 설정했습니다. 그러나 그래프를 드래그하면 그것이 포함 된 창이 그대로 유지되어 그래프가 창 밖으로 드래그됩니다. 그래프를 움직이면 윈도우가 함께 움직일 때 두 가지를 묶는 방법이 있습니까? 여기에 코드가 있습니다.캔버스를 pyqt로 끌 때 캔버스를 바운더리합니다.

from PyQt4 import QtCore 
from PyQt4 import QtGui 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 


class GraphCanvas(FigureCanvas): 
    def __init__(self): 

     # The window 
     self.fig = Figure(figsize=(5, 5), dpi=100) 
     self.ax1 = self.fig.add_subplot(111) 
     self.ax1.plot([1,2,3], [1,2,3], linewidth=2, color="#c6463d", label="line1") 
     FigureCanvas.__init__(self, self.fig) 

     # drag properties 
     self.draggable = True 
     self.dragging_threshold = 5 
     self.__mousePressPos = None 
     self.__mouseMovePos = None 

    def mousePressEvent(self, event): 
     if self.draggable and event.button() == QtCore.Qt.LeftButton: 
      self.__mousePressPos = event.globalPos()    # global 
      self.__mouseMovePos = event.globalPos() - self.pos() # local 
     super(GraphCanvas, self).mousePressEvent(event) 

    def mouseMoveEvent(self, event): 
     if self.draggable and event.buttons() & QtCore.Qt.LeftButton: 
      globalPos = event.globalPos() 
      moved = globalPos - self.__mousePressPos 
      if moved.manhattanLength() > self.dragging_threshold: 
       # move when user drag window more than dragging_threshould 
       diff = globalPos - self.__mouseMovePos 
       self.move(diff) 
       self.__mouseMovePos = globalPos - self.pos() 
     super(GraphCanvas, self).mouseMoveEvent(event) 

    def mouseReleaseEvent(self, event): 
     if self.__mousePressPos is not None: 
      if event.button() == QtCore.Qt.LeftButton: 
       moved = event.globalPos() - self.__mousePressPos 
       if moved.manhattanLength() > self.dragging_threshold: 
        # do not call click event or so on 
        event.ignore() 
       self.__mousePressPos = None 
     super(GraphCanvas, self).mouseReleaseEvent(event) 

''' End Class ''' 


class AppWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(AppWindow, self).__init__(parent) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 

     layout = QtGui.QVBoxLayout(self) 
     cpu_canvas = GraphCanvas() 
     layout.addWidget(cpu_canvas) 

''' End Class''' 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    main = AppWindow() 
    main.show() 
    sys.exit(app.exec_()) 
+0

코드가 기대하는 바를 구체적으로 설명해야합니다. 그래프가 움직이지 않게하려면 왜 그래프를 드래그 가능하게 만드나요? 창을 이동하기 위해서는 프레임이 없도록 이동하고 제목 표시 줄을 사용하여 이동할 수 있습니다. 결국 당신이 원하는 것을 정확하게 설명해야합니다. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest 저는 CPU 사용량을 표시하는 데스크탑 위젯을 만들고 그것을 드래그하여 화면에서 움직일 수 있기를 원합니다. 여기에 내가 가지고있는 이미지가 있습니다. (http://imgur.com/rm2RasQ) 현재 드래그 할 때 그래프 위젯은 잘 움직이지만 부모 창이 이동하지 않고 그래프가 가장자리에서 벗어납니다. 창문이 보이지 않게된다. [link] (http://imgur.com/a/qyeeK). 이게 말이 돼? – HexxNine

+0

또는 드래그 기능을 기본 창에 추가하면 모든 것이 잘 움직이지만 위젯이 그 중 99 %를 넘기 때문에 창을 차지할 여지가 거의 없습니다. – HexxNine

답변

1

AppWindow를 드래그하려면 그림 캔버스 대신이 클래스에서 드래그를 등록해야합니다. 그림 캔버스 내부에서 드래그 이벤트를 AppWindow로 라우팅 할 수 있습니다.

다음 코드는 변경하지 않고 코드를 변경하지 않고 부모 인수를 GraphCanvas에 추가하고 끌어 오기 함수가 부모 함수를 호출하도록합니다.

from PyQt4 import QtCore 
from PyQt4 import QtGui 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 


class GraphCanvas(FigureCanvas): 
    def __init__(self, parent = None): 
     self.parent = parent 
     # The window 
     self.fig = Figure(figsize=(5, 5), dpi=100) 
     self.ax1 = self.fig.add_subplot(111) 
     self.ax1.plot([1,2,3], [1,2,3], linewidth=2, color="#c6463d", label="line1") 
     FigureCanvas.__init__(self, self.fig) 


    def mousePressEvent(self, event): 
     self.parent.mousePressEvent(event) 

    def mouseMoveEvent(self,event): 
     self.parent.mouseMoveEvent(event) 

    def mouseReleaseEvent(self, event): 
     self.parent.mouseReleaseEvent(event) 


''' End Class ''' 


class AppWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(AppWindow, self).__init__(parent) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 

     layout = QtGui.QVBoxLayout(self) 
     cpu_canvas = GraphCanvas(self) 
     layout.addWidget(cpu_canvas) 

     self.draggable = True 
     self.dragging_threshold = 5 
     self.__mousePressPos = None 
     self.__mouseMovePos = None 

    def mousePressEvent(self, event): 
     if self.draggable and event.button() == QtCore.Qt.LeftButton: 
      self.__mousePressPos = event.globalPos()    # global 
      self.__mouseMovePos = event.globalPos() - self.pos() # local 
     super(AppWindow, self).mousePressEvent(event) 

    def mouseMoveEvent(self, event): 
     if self.draggable and event.buttons() & QtCore.Qt.LeftButton: 
      globalPos = event.globalPos() 
      moved = globalPos - self.__mousePressPos 
      if moved.manhattanLength() > self.dragging_threshold: 
       # move when user drag window more than dragging_threshould 
       diff = globalPos - self.__mouseMovePos 
       self.move(diff) 
       self.__mouseMovePos = globalPos - self.pos() 
     super(AppWindow, self).mouseMoveEvent(event) 

    def mouseReleaseEvent(self, event): 
     if self.__mousePressPos is not None: 
      if event.button() == QtCore.Qt.LeftButton: 
       moved = event.globalPos() - self.__mousePressPos 
       if moved.manhattanLength() > self.dragging_threshold: 
        # do not call click event or so on 
        event.ignore() 
       self.__mousePressPos = None 
     super(AppWindow, self).mouseReleaseEvent(event) 

''' End Class''' 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    main = AppWindow() 
    main.show() 
    sys.exit(app.exec_()) 
+0

대단히 감사합니다! 나는 배울 것이 많다, 나의 바보 같은 질문에 당신의 도움을 평가한다! – HexxNine

+1

여기이 질문은 완벽하게 유효하며 어리석은 질문이 아닙니다. 미래를 위해서는 질문을 공식화 할 때보다 구체적으로 시도해 볼 수 있습니다. 예를 들어 처음부터 이미 명확 해집니다. – ImportanceOfBeingErnest