簡體   English   中英

子窗口無法觸發PyQt5中的鼠標事件

[英]Child window failed to trigger mouse event in PyQt5

我想捕獲子窗口的鼠標事件,但是問題是鼠標事件沒有傳遞到該子窗口。...在Internet上找到信息之后,我發現我需要自定義按鈕。但是我仍然沒有這樣做后得到任何回應。 誰能告訴我在該“子”窗口中捕獲鼠標事件還需要做什么? 這是我的代碼:

from PyQt5 import QtCore,QtWidgets
from PyQt5.QtWidgets import *
import sys

class My_top_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(640, 532)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.Products = MyButton()
        self.verticalLayout.addWidget(self.Products)
        self.Products.clicked.connect(self.accept)
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.Products.setText(_translate("Dialog", "top window"))

    def accept(self):
        self.dialog = QDialog()
        ui = My_second_Dialog()
        ui.setupUi(self.dialog)
        self.dialog.show()

class My_second_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(640, 480)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.fetch = MyButton()
        self.verticalLayout.addWidget(self.fetch)
        self.fetch.clicked.connect(self.accept)
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.fetch.setText(_translate("Dialog", "second window"))

    def accept(self):
        QMessageBox.information(self, "success",
                                "success.")
class MyButton(QPushButton):
    def __init__(self, parent=None):
        super(MyButton, self).__init__(parent)
        self.setFixedSize(111, 111)

    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == QtCore.Qt.LeftButton:
            self.clicked.emit(True)
            self.parent().mousePressEvent(QMouseEvent)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = QDialog()
    ui = My_top_Dialog()
    ui.setupUi(dialog)
    dialog.show()
    sys.exit(app.exec_())

這是解決問題的第二種方法。 因為回復注釋無法顯示代碼塊,所以在這里顯示我的代碼,我認為問題的根本原因是我沒有完整地關聯主窗口和子窗口。它是從成員還是從關系中建立關系直接繼承一個類,這兩個都可以使子窗口信號觸發不受影響,這是我的代碼:

from PyQt5 import QtCore,QtWidgets
from PyQt5.QtWidgets import *
import sys

class My_top_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(640, 532)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.Products = MyButton()
        self.verticalLayout.addWidget(self.Products)
        self.Products.clicked.connect(self.accept)
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.Products.setText(_translate("Dialog", "top window"))

    def accept(self):
        dialog = My_second_Dialog()
        dialog.exec_()

class My_second_Dialog(QDialog,My_top_Dialog):
    def __init__(self,parent = None):
        QDialog.__init__(self,parent)
        self.setupUi(self)
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(640, 480)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.fetch = MyButton()
        self.verticalLayout.addWidget(self.fetch)
        self.fetch.clicked.connect(self.accept)
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.fetch.setText(_translate("Dialog", "second window"))

    def accept(self):
        QMessageBox.information(self, "success",
                                "success.")
class MyButton(QPushButton):
    def __init__(self, parent=None):
        super(MyButton, self).__init__(parent)
        self.setFixedSize(111, 111)

    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == QtCore.Qt.LeftButton:
            self.clicked.emit(True)
            self.parent().mousePressEvent(QMouseEvent)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = QDialog()
    ui = My_top_Dialog()
    ui.setupUi(dialog)
    dialog.show()
    sys.exit(app.exec_())

試試吧:

from PyQt5 import QtCore,QtWidgets
from PyQt5.QtWidgets import *
import sys

class My_top_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(640, 532)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.Products = MyButton()
        self.verticalLayout.addWidget(self.Products)
        self.Products.clicked.connect(self.accept)
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.Products.setText(_translate("Dialog", "top window"))

    def accept(self):
        self.dialog = QDialog()
        self.ui     = My_second_Dialog()
        self.ui.setupUi(self.dialog)
        self.dialog.show()

class My_second_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(640, 480)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.fetch = MyButton()
        self.verticalLayout.addWidget(self.fetch)
        self.fetch.clicked.connect(self.accept)
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.fetch.setText(_translate("Dialog", "second window"))

    def accept(self):
        QMessageBox.information(self.fetch, "Success", "success.")   # +++ self.fetch


class MyButton(QPushButton):
    def __init__(self, parent=None):
        super(MyButton, self).__init__(parent)
        self.setFixedSize(111, 111)

    def mousePressEvent(self, event): #QMouseEvent):
        if event.button() == QtCore.Qt.LeftButton:
            self.clicked.emit(True)
            #self.parent().mousePressEvent(QMouseEvent)               # --- 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = QDialog()
    ui = My_top_Dialog()
    ui.setupUi(dialog)
    dialog.show()
    sys.exit(app.exec_())

在此處輸入圖片說明

暫無
暫無

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

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