Перемещение бескаркасного QDialog с помощью MouseMoveEvent

1

Итак, у меня есть бескаркасный 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
Теги:
mouseevent
pyqt
qdialog

2 ответа

1
Лучший ответ

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

  • 0
    Отлично! Это сработало, я обновил свой код выше, чтобы показать, где я до сих пор. Теперь мне нужно иметь возможность схватить мышь там, где она находится по отношению к диалогу, поскольку всякий раз, когда я щелкаю левой кнопкой мыши, чтобы перетаскивать диалог, верхний левый угол диалога привязывается к мыши.
  • 0
    вы решили эту проблему? моя мышь тоже щелкает в верхнем левом углу диалогового окна .. я не могу от нее избавиться
Показать ещё 2 комментария
2

Предлагаемое решение перемещает Окно, но курсор мыши переходит к 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню