簡體   English   中英

嘗試使用鼠標按鈕時獲取退出代碼-1073740791(0xC0000409)

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

我正在嘗試開發一個用戶界面來編輯圖像。 當我單擊鼠標左鍵時,我想存儲鼠標 position。 它吐出退出代碼-1073740791(0xC0000409)

不知道它為什么這樣做,或者不知道它的真正含義沒有設法找到它。 我正在與 Qt 設計師合作

到目前為止的代碼:

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

任何幫助表示贊賞。

在 python 中,如果類多次使用相同的方法,則只有最后一個有效,因此在您的情況下,只有第二個 eventFilter 有效,並且此方法必須返回 Boolean 但您不返回任何您不返回的內容滿足那個條件。 解決方案是:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM