Проблемы с mousepressevent - PullRequest
       35

Проблемы с mousepressevent

2 голосов
/ 22 августа 2011

Я только что задал похожий вопрос, но (извините!) Думаю, мне понадобится дополнительная помощь.У меня проблема с сигналами в pyqt.Позвольте мне опубликовать весь код, он не длинный, и мне легче объяснить ...сделать перетаскивание по экрану, нажав и перетащив в любое место на заднем плане.Моя проблема: backgroundmousepressevent и backgroundmousemoveevent не запускаются, когда я нажимаю или перемещаю кнопку.Вот и мне интересно: где ошибка?Я что-то неправильно написал или как?Большое спасибо!

Маттео

Ответы [ 2 ]

5 голосов
/ 22 августа 2011

В Qt события отличаются от сигналов и слотов. События представлены QEvent объектами, которые передаются методу event() из QObject s, где они обычно отправляются специализированным методам, таким как mousePressEvent и mouseMoveEvent. Поскольку они не являются сигналами, вы не можете подключить их к слотам.

Вместо этого просто заново реализуйте функции событий, чтобы выполнять пользовательские операции. Обязательно вызовите исходную реализацию с super, если только вы не знаете, что делаете.

def mousePressEvent(self, event):
    super(FenixGui, self).mousePressEvent(event)
    print "test 1"
    self.offset = event.pos()

def mouseMoveEvent(self, event):
    super(FenixGui, self).mouseMoveEvent(event)
    print "test 2"
    x=event.globalX()
    y=event.globalY()
    x_w = self.offset.x()
    y_w = self.offset.y()
    self.move(x-x_w, y-y_w)

Как правило, Qt предупреждает вас при попытке подключения к несуществующим сигналам, записывая предупреждающее сообщение на консоль. Кроме того, вы можете предотвратить эту ситуацию, используя сигналы и слоты нового стиля вместо старого, больше C ++ - ish SIGNAL() функция:

lineEdit = QtGui.QLineEdit()
lineEdit.valueChanged.connect(self.myHandlerMethod)
1 голос
/ 22 августа 2011

Вы пытаетесь подключиться к сигналам mousePressEvent и mouseMoveEvent в QWidget, но они не существуют как сигналы.Попробуйте переопределить методы вместо этого.Это работает для меня:

from PyQt4 import QtGui, QtCore, Qt
import time
import math

class FenixGui(QtGui.QWidget):

    def mousePressEvent(self, event):
        print "test 1"
        self.offset = event.pos()
        QtGui.QWidget.mousePressEvent(self, event)


    def mouseMoveEvent(self, event):
        print "test 2"
        x=event.globalX()
        y=event.globalY()
        x_w = self.offset.x()
        y_w = self.offset.y()
        self.move(x-x_w, y-y_w)
        QtGui.QWidget.mousePressEvent(self, event)

    def __init__(self):
        super(FenixGui, self).__init__()

        # setting layout type
        hboxlayout = QtGui.QHBoxLayout(self)
        self.setLayout(hboxlayout)

        # hiding title bar
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        # setting window size and position
        self.setGeometry(200, 200, 862, 560)
        self.setAttribute(Qt.Qt.WA_TranslucentBackground)
        self.setAutoFillBackground(False)

        # creating background window label
        backgroundpixmap = QtGui.QPixmap("fenixbackground.png")
        self.background = QtGui.QLabel(self)
        self.background.setPixmap(backgroundpixmap)
        self.background.setGeometry(0, 0, 862, 560)

        # fenix logo
        logopixmap = QtGui.QPixmap("fenixlogo.png")
        self.logo = QtGui.QLabel(self)
        self.logo.setPixmap(logopixmap)
        self.logo.setGeometry(100, 100, 400, 150)

def main():
    app = QtGui.QApplication([])
    exm = FenixGui()
    exm.show()
    app.exec_()

if __name__ == '__main__':
    main()
...