Dk_chunky
Dk_chunky

Reputation: 1

Getting exit code -1073740791 (0xC0000409) while trying to use mouse button pressed

i'm trying to develop a ui to edit images. I want to store mouse position when i click the left mouse button. it spits out exit code -1073740791 (0xC0000409)

Dont why it does that or dont really what it means didnt managed to find it. And im working with Qt designer

Code So far:

from PyQt5 import QtCore, QtGui, QtWidgets

# I have my event filter's
class MouseTracker(QtCore.QObject):
    positionChanged = QtCore.pyqtSignal(QtCore.QPoint)
    mouseclicked = QtCore.pyqtSignal(QtCore.Qt.MouseButton)
    def __init__(self, widget):
        super(MouseTracker, self).__init__(widget)
        self._widget = widget
        self.widget.setMouseTracking(True)
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, o, e):
        if (o is self.widget and e.type() == QtCore.QEvent.MouseMove):
            self.positionChanged.emit(e.pos())
        return super().eventFilter(o, e)
    def eventFilter(self,o,e):
        if o is self.widget and e.type() == QtCore.QEvent.MouseButtonPress:
            self.mouseclicked.emit(e.buttons())

#This is the thing from Qt designer 
class Ui_Widget(object):
    def setupUi(self, Widget):
        Widget.setObjectName("Widget")
        Widget.resize(700, 700)
        Widget.setCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))
        Widget.setMouseTracking(False)
        self.gridLayout = QtWidgets.QGridLayout(Widget)
        self.gridLayout.setObjectName("gridLayout")
        self.save = QtWidgets.QPushButton(Widget)
        self.save.setObjectName("save")
        self.gridLayout.addWidget(self.save, 2, 2, 1, 1)
        self.cut = QtWidgets.QPushButton(Widget)
        self.cut.setObjectName("cut")
        self.gridLayout.addWidget(self.cut, 2, 1, 1, 1)
        self.open = QtWidgets.QPushButton(Widget)
        self.open.setObjectName("open")
        self.gridLayout.addWidget(self.open, 2, 0, 1, 1)
        self.pos_data = QtWidgets.QLabel(Widget)
        self.pos_data.setText("")
        self.pos_data.setObjectName("pos_data")
        self.gridLayout.addWidget(self.pos_data, 0, 0, 1, 3, QtCore.Qt.AlignTop)
        self.resim = QtWidgets.QLabel(Widget)
        self.resim.setMouseTracking(True)
        self.resim.setText("")
        self.resim.setPixmap(QtGui.QPixmap("../../../Pictures/meme.png"))
        self.resim.setScaledContents(True)
        self.resim.setObjectName("resim")

        self.tracker = MouseTracker(self.resim)
        self.tracker.positionChanged.connect(self.on_positionChanged)
        self.tracker.mouseclicked.connect(self.store_pos)


        self.gridLayout.addWidget(self.resim, 4, 0, 1, 3)

        self.label_position = QtWidgets.QLabel(
            self.resim, alignment=QtCore.Qt.AlignCenter
        )
        self.label_position.setStyleSheet('background-color: white; border: 1px solid black')

        self.retranslateUi(Widget)
        QtCore.QMetaObject.connectSlotsByName(Widget)

    def retranslateUi(self, Widget):
        _translate = QtCore.QCoreApplication.translate
        Widget.setWindowTitle(_translate("Widget", "Form"))
        self.save.setText(_translate("Widget", "Kaydet"))
        self.cut.setText(_translate("Widget", "Kırp"))
        self.open.setText(_translate("Widget", "Dosya Aç"))

    # this is the functions that works with move event signal
    def on_positionChanged(self, pos):
        delta = QtCore.QPoint(30, -15)
        self.x = pos.x()
        self.y = pos.y()
        self.label_position.show()
        self.label_position.move(pos + delta)
        self.label_position.setText("(%d, %d)" % (pos.x(), pos.y()))
        self.label_position.adjustSize()

    # this is the functions that supposed to work with mouse clicked signal 
    #Program broke when i add this function and the signal
    def store_pos(self, buttons):
        if buttons == QtCore.Qt.LeftButton:
            text = f'x: {self.x}, y: {self.y}'
            self.pos_data.setText(text)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    Widget = QtWidgets.QWidget()
    ui = Ui_Widget()
    ui.setupUi(Widget)
    Widget.show()
    sys.exit(app.exec_())

Any help is appreciated.

Upvotes: 0

Views: 455

Answers (1)

eyllanesc
eyllanesc

Reputation: 244162

In python if the classes have the same method several times then only the last one will be valid, so in your case only the second eventFilter will be valid and it is mandatory that this method returns a Boolean but you do not return anything you do not meet that condition. The solution is:

class MouseTracker(QtCore.QObject):
    positionChanged = QtCore.pyqtSignal(QtCore.QPoint)
    mouseclicked = QtCore.pyqtSignal(QtCore.Qt.MouseButton)

    def __init__(self, widget):
        super(MouseTracker, self).__init__(widget)
        self._widget = widget
        self.widget.setMouseTracking(True)
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, o, e):
        if o is self.widget:
            if e.type() == QtCore.QEvent.MouseMove:
                self.positionChanged.emit(e.pos())
            elif e.type() == QtCore.QEvent.MouseButtonPress:
                self.mouseclicked.emit(e.buttons())
        return super().eventFilter(o, e)

Upvotes: 1

Related Questions