Итак, у меня есть бескаркасный QDialog, который я хочу, чтобы двигаться, просто щелкнув и перетащив его. Учитывая приведенный ниже код, перетаскивание диалогового окна всегда привязывает самую левую (0,0) диалогового окна к мыши. Как я могу обойти это, вернее, что может быть для него математикой?
Стандартный QDialog со следующим основным подклассом:
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
Вместо event.pos() попробуйте вызвать event.globalPos(). Из QMouseEvent ссылка: "Если вы перемещаете виджет в результате события мыши, используйте глобальную позицию, возвращаемую функцией globalPos(), чтобы избегайте дрожания".
Предлагаемое решение перемещает Окно, но курсор мыши переходит к 0,0 окна. Я хотел, чтобы указатель мыши оставался на x, y окна все время.
Здесь обновлена версия кода [в QT5]:
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, потому что "замаскированное" бескаркасное окно немного меньше реального кадра. Не знаю, как рассчитать эту разницу.
ВВЕРХ. После долгого времени я обнаружил одну критическую ошибку. Если вы нажмете левую кнопку мыши на любой кнопке (сразу после запуска приложения) и перетащите указатель мыши от этой кнопки, ваше приложение выйдет из строя, потому что мы ссылаемся на несуществующую переменную LeftClick. Поэтому в классе Main нам нужно создать LeftClick.