按名称使用自动连接插槽

Posted

技术标签:

【中文标题】按名称使用自动连接插槽【英文标题】:Using the automatic connect slots by name 【发布时间】:2019-01-18 19:59:45 【问题描述】:

不久前,我一直在使用(在工作中的给定框架中)Qt4 中的按名称自动连接插槽功能,并带有一个装饰器。像这样的:

self.button1 = QtWidgets.QPushButton("Click me!")
...
@QtCore.Slot()
def on_button1_clicked(self):
     # whatever the method does...

而不是这个:

self.button1 = QtWidgets.QPushButton("Click me!")
self.button1.clicked.connect(self.handle_button)
...
def self.handle_button(self):
    # whatever the method does...

现在我无法使其与 PySide2 (Qt-5.12) 一起使用。我在这里缺少什么使它起作用?

import sys
import random
from PySide2 import QtCore, QtWidgets, QtGui

class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.hello = ["Hallo Welt", "Hola Mundo"]

        self.button1 = QtWidgets.QPushButton("Click me!")
        self.text = QtWidgets.QLabel("Hello World")
        self.text.setAlignment(QtCore.Qt.AlignCenter)

        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button1)
        self.setLayout(self.layout)

        QtCore.QMetaObject.connectSlotsByName(self)

        #self.button1.clicked.connect(self.on_button1_clicked)

    @QtCore.Slot()
    def on_button1_clicked(self):
        self.text.setText(random.choice(self.hello))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

widget = MyWidget()
widget.show()

sys.exit(app.exec_())

【问题讨论】:

QtCore.QMetaObject.connectSlotsByName(self). 您能说得更准确些吗?我在示例中做错了什么? 【参考方案1】:

connectSlotsByName 功能通常与 Qt Designer 文件一起使用。当使用uic 工具转换这些文件时,会添加大量样板代码。这包括设置对象名称,这是通过名称连接插槽时需要的:

self.button1 = QtWidgets.QPushButton("Click me!")
self.button1.setObjectName('button1')

显然,对象名称必须与插槽中使用的名称匹配。

【讨论】:

我必须承认我一直在使用 Qt Designer 文件。我认为无论如何都有可能使用它。没关系,只是多几行就可以照常使用了。谢谢!! 只是想节省行数,最后,还有一个...不值得,我猜...但我很高兴知道它是如何工作的。

以上是关于按名称使用自动连接插槽的主要内容,如果未能解决你的问题,请参考以下文章

Qt连接两个信号和一个插槽

如何将 Qt 信号/插槽名称存储到数据结构中?

在循环中连接 PyQt4 中的插槽和信号

Qt 计算器中的连接更少

在 QObject 之间跨不同线程连接信号/插槽

为啥我需要用 pyqtSlot 装饰连接的插槽?