Reputation: 1
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
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