2

私は似たような質問をしましたが(すみません!)もっと助けが必要だと思います。pyqt のシグナルに問題があります。コード全体を投稿させてください。長くはなく、説明するのが簡単です...

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

class FenixGui(QtGui.QWidget):

    def backgroundmousepressevent(self, event):
        print "test 1"
        self.offset = event.pos()


    def backgroundmousemoveevent(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)


    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)

        # making window draggable by the window label
        self.connect(self.background,QtCore.SIGNAL("mousePressEvent()"),         self.backgroundmousepressevent)
        self.connect(self.background,QtCore.SIGNAL("mouseMoveEvent()"), self.backgroundmousemoveevent)


        # 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()

これがコードです。バックグラウンドの任意の場所をクリックしてドラッグして、画面上でドラッグできるようにしたい単純な GUI です。私の問題は: backgroundmousepressevent と backgroundmousemoveevent は、ボタンを押したり動かしたりしても発生しません。だから私は疑問に思います: エラーはどこですか? スペルを間違えましたか、それとも何ですか?どうもありがとうございました!

マッテオ

4

2 に答える 2

5

Qtでは、イベントはシグナルやスロットとは異なります。イベントは、sのメソッドにQEvent渡されるオブジェクトによって表されます。オブジェクトは通常、やなどの特殊なメソッドにディスパッチされます。信号ではないため、スロットに接続することはできません。event()QObjectmousePressEventmouseMoveEvent

代わりに、イベント関数を再実装してカスタム処理を実行するだけです。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 ++風の関数の代わりに、新しいスタイルのシグナルとスロットを使用することで、この状況を防ぐことができます。SIGNAL()

lineEdit = QtGui.QLineEdit()
lineEdit.valueChanged.connect(self.myHandlerMethod)
于 2011-08-22T09:30:31.740 に答える
1

QWidget の mousePressEvent および mouseMoveEvent シグナルに接続しようとしていますが、シグナルとして存在しません。代わりにメソッドをオーバーライドしてみてください。これは私にとってはうまくいきます:

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()
于 2011-08-22T09:43:35.187 に答える