PyQt5-通过Qt Designer创建的QPushButton的悬停信号

问题描述 投票:0回答:1

我刚刚创建了第一个用于存储个人数据的PyQt应用。在“新建条目”对话框上,有一个按钮,单击该按钮时,将使用默认值填充QLineEdits。我想实现一个功能,以便当鼠标指针悬停在此Default按钮上时,您可以预览QLineEdits的设置(可能通过setPlaceholderText)。

[寻找解决方案后,我遇到了这个解决方案:How to Catch Hover and Mouse Leave Signal In PyQt5子类化PushButton并重新实现enterEvent和离开事件。

但是我使用Qt Designer创建了GUI,并且由于QPushButton是在Designer的.ui文件中创建的,我无法真正进行更改,因此我对如何应用此解决方案感到有些困惑...

[这里是通过pyuic5转换为.py时.ui文件的摘录

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")

        self.pushButton_contact_defaut = QtWidgets.QPushButton(self.groupBox_client)
        self.pushButton_contact_defaut.setGeometry(QtCore.QRect(80, 130, 165, 22))
        self.pushButton_contact_defaut.setMouseTracking(True)
        self.pushButton_contact_defaut.setAutoDefault(False)
        self.pushButton_contact_defaut.setObjectName("pushButton_contact_defaut")

正如我说过的那样,由于每次对ui文件进行更改时都会重置代码,因此我无法真正在此处进行更改...

这也是我的主要python文件的摘录,在这里我“处理”了所有连接和逻辑。我显然不太熟悉Python和PyQt(或与编程相关的任何东西!)有没有一种方法可以从代码中“重新定义” PushButton,这是解决问题的最佳方法,还是我还缺少其他功能?

class NewEntry(NE_Base, NE_Ui):
    def __init__(self):
        super().__init__()
        QDialog.__init__(self, parent=main_window)
        self.ui = NE_Ui()
        self.ui.setupUi(self)
        self.setWindowModality(0)
        self.ui.pushButton_contact_defaut.clicked.connect(self.contact_defaut)

感谢您的帮助!

编辑:基于musicamante的回答,我对我的应用程序正常工作,在该应用程序中,我有2个按钮可以通过执行以下操作来“填充”不同的lineEdit。

我在两个按钮上都应用了.installEventFilter(self)并添加了:

 def eventFilter(self, source, event):
    if event.type() == QtCore.QEvent.Enter and source == self.ui.pushButton_contact_defaut:
        self.ui.contact_text.setPlaceholderText(self.contact_base)
        self.ui.cell_text.setPlaceholderText(self.cell)
        self.ui.email_text.setPlaceholderText(self.courriel)

    if event.type() == QtCore.QEvent.Enter and source == self.ui.pushButton_copy_adress:
        self.ui.street_text.setPlaceholderText(self.street)
        self.ui.city_text.setPlaceholderText(self.city)
        self.ui.postal_text.setPlaceholderText(self.postal)

    elif event.type() == QtCore.QEvent.Leave:
        self.ui.contact_text.setPlaceholderText('')
        self.ui.cell_text.setPlaceholderText('')
        self.ui.email_text.setPlaceholderText('')
        self.ui.street_text.setPlaceholderText('')
        self.ui.city_text.setPlaceholderText('')
        self.ui.postal_text.setPlaceholderText('')

    return super().eventFilter(source, event)

以这种方式处理多个pushButton似乎有点尴尬,希望有人也能启发我解决该问题,但与此同时,它可以工作!

python pyqt
1个回答
0
投票

您可以在要跟踪的按钮上安装事件过滤器。事件过滤器是一个系统,可以“监视”受监视对象收到的事件,并且最终可以在事后执行某些操作(包括忽略事件本身)。

根据您的情况,您需要检查EnterLeave事件,这些事件在每次鼠标进入或离开窗口小部件时都会触发(通常在enterEvent和[C0 ]子类)。

leaveEvents

NEVER编辑class NewEntry(QDialog, NE_Ui): def __init__(self, parent=None): super().__init__(parent) # Don't do the following, is unnecessary: you already called __init__ # QDialog.__init__(self, parent=main_window) self.ui = NE_Ui() self.ui.setupUi(self) self.ui.pushButton_contact_defaut.installEventFilter(self) def eventFilter(self, source, event): if event.type() == QEvent.Enter: self.ui.lineEdit.setPlaceholderText('Default text') elif event.type() == QEvent.Leave: self.ui.lineEdit.setPlaceholderText('') # *always* return a bool value (meaning that the event has been acted upon # or not), it's common to call the base class implementation and then # return the result of that return super().eventFilter(source, event) 生成的文件,也不要开始将它们用作代码的开头。正如您已经发现的那样,每次更改ui时都会清除它们,最好将它们作为模块导入(或通过pyuic使用它们)总是更好。

© www.soinside.com 2019 - 2024. All rights reserved.