QPushButton 的子类化

Posted

技术标签:

【中文标题】QPushButton 的子类化【英文标题】:Subclassing of QPushButton 【发布时间】:2016-03-27 18:17:59 【问题描述】:

我一直在寻找一种继承 QPushButton 的方法,这样我就可以在构建新按钮时连接“点击”信号,例如:

Btn = CustomButtonClass('Text', clicked='lambda: self.func(par)')

到目前为止 - 没有任何成功。

我想问题是将正确的参数传递给 CustomButtonClass 的 init(),但不知道是什么,为什么。

我有什么:

class CustomButtonClass(QtGui.QPushButton):
    def __init__(self, text, parent=None):
        super().__init__()

我还注意到:

Btn.clicked.connect(lambda: self.func(par))

也不行。

我是否必须重写 QPushButton 的 mouseReleaseEvent 或构造自定义信号才能完成我的任务?

【问题讨论】:

【参考方案1】:

您不需要创建子类,因为 PyQt 和 PySide 都已经具有此功能(请参阅 PyQt 文档中的 Connecting Signals Using Keyword Arguments)。

演示:

>>> from PyQt4 import QtGui
>>> app = QtGui.QApplication([])
>>> btn = QtGui.QPushButton('Test', clicked=lambda: print('Hello World!'))
>>> btn.click()
Hello World!

如果您仍然需要子类化,那么您当然可以简单地这样做:

class CustomButtonClass(QtGui.QPushButton):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

【讨论】:

也许我的问题不够具体...好吧,我真的需要自定义子类,因为我的按钮需要额外的格式和功能。但是随着您的回答,我想到了一个想法,即我可以使用特定于应用程序的说明覆盖 QPushButton mouseReleaseEvent ... 非常感谢! :) @KrzysiekŁuczak。没有必要做这样的事情——我的回答仍然有效。我添加了更多代码来说明我的意思。 迟到的答案,但是......在我的情况下,我错过了 __init__() 参数中的 *args 和 **kwargs

以上是关于QPushButton 的子类化的主要内容,如果未能解决你的问题,请参考以下文章

Qt:QPushButton 单击双击响应区分

突出显示qpushbutton pyqt中的单个字符[重复]

为啥当 QPushButton::paintEvent 后面跟着 QPainter::fillRect 时应用程序会崩溃?

更改其子类中的 QPushButton 区域掩码以创建 RoundButton

样式化的*** QPushButton 小部件无法正确呈现

Qt 信号继承?