Перемещение бескаркасного QDialog с помощью MouseMoveEvent - PullRequest
1 голос
/ 25 апреля 2011

Итак, у меня есть безрамочный 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

Ответы [ 2 ]

2 голосов
/ 08 декабря 2015

Предлагаемое решение перемещает окно, но курсор мыши переходит на 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, потому что «замаскированное» безрамное окно немного меньше, чем реальное рамочное окно.Пока не знаю, как рассчитать эту разницу.

UP. Через долгое время я обнаружил одну критическую ошибку.Если вы нажмете левую кнопку мыши на любой кнопке (сразу после запуска приложения) и перетащите курсор мыши от этой кнопки, ваше приложение будет аварийно завершено, поскольку мы ссылаемся на несуществующую переменную LeftClick .Вот почему в классе Main нам нужно создать LeftClick .

1 голос
/ 28 апреля 2011

Вместо event.pos (), попробуйте вызвать event.globalPos ().Из ссылки QMouseEvent «Если вы перемещаете виджет в результате события мыши, используйте глобальную позицию, возвращаемую функцией globalPos (), чтобы избежать дрожания».

...