2016-06-09 2 views
2

프레임리스 창에 테두리를 설정하는 예제가 있지만 드래그 할 수 없습니다. 틀없는 창을 드래그 가능하게 만들려면 어떻게해야합니까? 특히 내가 예를 볼 수 있다면 그것은 굉장 할 것이다. 다음은 예제 코드입니다 (일반적으로 코드가 더 길기 때문에 많은 라이브러리가 있어도 상관 없습니다).PyQt5 draggable frameless window

from PyQt5.QtWidgets import (QMessageBox,QApplication, QWidget, QToolTip, QPushButton, 
          QDesktopWidget, QMainWindow, QAction, qApp, QToolBar, QVBoxLayout, 
          QComboBox,QLabel,QLineEdit,QGridLayout,QMenuBar,QMenu,QStatusBar, 
          QTextEdit,QDialog,QFrame,QProgressBar 
          ) 
from PyQt5 import QtCore, QtWidgets, QtGui 
from PyQt5.QtGui import QIcon,QFont,QPixmap,QPalette 
from PyQt5.QtCore import QCoreApplication, Qt,QBasicTimer 

import sys 

class cssden(QMainWindow): 
    def __init__(self): 
     super().__init__() 


     self.mwidget = QMainWindow(self) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 


     #size 
     self.setFixedSize(320, 450) 
     self.center 


     #label 
     self.lbl = QLabel(self) 
     self.lbl.setText("test") 
     self.lbl.setStyleSheet("background-color: rgb(0,0,0);" 
           "border: 1px solid red;" 
           "color: rgb(255,255,255);" 
           "font: bold italic 20pt 'Times New Roman';") 
     self.lbl.setGeometry(5,5,60,40) 

     self.show() 

    #center 
    def center(self): 
     qr = self.frameGeometry() 
     cp = QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

app = QApplication(sys.argv) 
app.setStyleSheet("QMainWindow{background-color: darkgray;border: 1px solid black}") 

ex = cssden() 
sys.exit(app.exec_()) 

답변

4

마우스 이벤트를 직접 처리해야합니다.

  • 우리는, 우리가 마지막으로 클릭 된 점 사이의 거리를 계산하는 것이다하는 mouseMoveEvent을 추가 할 것입니다 우리가 지난
  • 그런 다음 창에서 클릭 한 위치를 유지할 것이다, mousePressEvent에 이벤트를 추가해야합니다 및 현재 마우스 위치. 우리는이 거리에 따라 창을 움직일 것입니다.

이 고정 된 코드는 다음과 같습니다

from PyQt5.QtWidgets import (QMessageBox,QApplication, QWidget, QToolTip, QPushButton, 
          QDesktopWidget, QMainWindow, QAction, qApp, QToolBar, QVBoxLayout, 
          QComboBox,QLabel,QLineEdit,QGridLayout,QMenuBar,QMenu,QStatusBar, 
          QTextEdit,QDialog,QFrame,QProgressBar 
          ) 
from PyQt5 import QtCore, QtWidgets, QtGui 
from PyQt5.QtGui import QIcon,QFont,QPixmap,QPalette 
from PyQt5.QtCore import QCoreApplication, Qt,QBasicTimer, QPoint 

import sys 

class cssden(QMainWindow): 
    def __init__(self): 
     super().__init__() 


     self.mwidget = QMainWindow(self) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 


     #size 
     self.setFixedSize(320, 450) 
     self.center() 


     #label 
     self.lbl = QLabel(self) 
     self.lbl.setText("test") 
     self.lbl.setStyleSheet("background-color: rgb(0,0,0);" 
           "border: 1px solid red;" 
           "color: rgb(255,255,255);" 
           "font: bold italic 20pt 'Times New Roman';") 
     self.lbl.setGeometry(5,5,60,40) 

     self.oldPos = self.pos() 

     self.show() 

    #center 
    def center(self): 
     qr = self.frameGeometry() 
     cp = QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

    def mousePressEvent(self, event): 
     self.oldPos = event.globalPos() 

    def mouseMoveEvent(self, event): 
     delta = QPoint (event.globalPos() - self.oldPos) 
     #print(delta) 
     self.move(self.x() + delta.x(), self.y() + delta.y()) 
     self.oldPos = event.globalPos() 

app = QApplication(sys.argv) 
app.setStyleSheet("QMainWindow{background-color: darkgray;border: 1px solid black}") 

ex = cssden() 
sys.exit(app.exec_()) 
+0

큰 작동합니다. 마우스를 가리 키는 것과 같은 마우스 이벤트에 대한 예제가 있습니까? C++ 예제 만 있고 파이썬으로 변환하는 데 어려움이 있습니다. – GLHF

+0

예, 많은 파이썬 예제가 없습니다. 가장 좋은 방법은 Qt C++ 코드를 파이썬으로 변환하는 방법을 이해하는 것입니다. 처음에는 그렇게 복잡하지 않습니다. –

+0

여기에 관련된 [코드 예] (https://gist.github.com/zed/77e705caa840bab117057952f9ca6191) – jfs