如何使用pyside2插槽功能共享数据?

ThinWybk

我有一个PySide2带有QPushButton按钮GUI应用程序,该按钮@Slot连接功能。如何与该功能共享数据?

from PySide2.QtCore import Slot
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QVBoxLayout

@Slot()
def button_XYZ_callback():
    # Function which is executed when the button XYZ is clicked.
    # I'd like to access the __main__s context data "parent_data" here.
    pass

if __name__ == '__main__':
    # parent context data what I want to access (read only)
    parent_data = "blub"

    application = QApplication(sys.argv)
    window = QMainWindow()
    central_widget = QWidget()
    xyz_button = QPushButton("XYZ", central_widget)
    xyz_button.clicked.connect(button_xyz_callback)
    layout = QVBoxLayout(central_widget)
    layout.addWidget(xyz_button)
    window.show()
    sys.exit(application.exec_())
算了吧

根据Python的LEGB规则parent_data可以从button_XYZ_callback函数内部访问全局变量

但是,如果您希望减少函数对全局变量的依赖,则标准技术是定义一个类,并使用类或实例属性存储全局值之前的内容:

# based on code from https://wiki.qt.io/Qt_for_Python_Tutorial_ClickableButton
import sys
from PySide2 import QtCore, QtWidgets, QtGui


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

        QtWidgets.QWidget.__init__(self)
        self.data = data
        self.button = 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.button)
        self.setLayout(self.layout)
        self.button.clicked.connect(self.button_XYZ_callback)

    @QtCore.Slot()
    def button_XYZ_callback(self):
        print(self.data)

if __name__ == "__main__":
    parent_data = "blub"
    app = QtWidgets.QApplication(sys.argv)
    widget = MyWidget(data=parent_data)
    widget.show()
    sys.exit(app.exec_())

或者,如果在定义回调之前就已经知道数据,则可以使用函数工厂将数据放入回调的封闭范围内:

import sys
from PySide2.QtCore import Slot
from PySide2.QtWidgets import QApplication, QPushButton


def make_callback(data):
    @Slot()
    def button_XYZ_callback():
        print(data)
    return button_XYZ_callback

if __name__ == "__main__":
    parent_data = "blub"
    # https://wiki.qt.io/Qt_for_Python_Tutorial_ClickableButton
    app = QApplication(sys.argv)
    button = QPushButton("Click me")
    button.clicked.connect(make_callback(parent_data))
    button.show()
    app.exec_()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Qt Designer在PySide2中实现信号/插槽时出错

使用PySide2将python信号连接到QML ui插槽

如何使用PyQt5 / PySide2显示熊猫数据框

将QML信号连接到PySide2插槽

Pyside2接收器功能

如何使用PySide2实现响应式画廊视图

如何使用PySide2在matplotlib中显示图形?

如何使用PySide2在qml中设置值?

如何使用PySide2使我的选择框正确移动?

如何使用 PySide2 将具有 NULL 值的记录添加到我的 SQLite 数据库?

Pyside2我如何移动盒子?

Pyside2如何获取鼠标位置?

如何移动按钮Pyside2

PySide2拖放功能不起作用

无法从QML访问Pyside2 QQmlPropertyMap的插槽;Python版本的旧C ++错误?

在“moveToThread”之後,工作人員的插槽中未收到 PySide2 信號

是否可以通过QML从PySide2插槽(服务调用)获取对象列表?

如何在Vue 2渲染功能中使用插槽?

如何在PySide2中使用QLabel加载图像

如何使用PySide2在QWizardPage中加载Qt设计器文件(.ui)

如何使用PySide2 Python后端将PyQtGraph嵌入QML中?

如何使用带有 pyside2 的 QUiLoader() 打开新窗口

如何使用PySide2在OSX上创建菜单栏?

在 Python PySide2 中使用 sleep 时如何查看同一函数的多个变化

如何使用 PySide2 的 QPropertyAnimation 平滑显示 QProgressBar 值更新?

如何传递要在Pyside2中调用的函数?

如何访问PySide2中选中的QCheckBox?

如何修复PySide2 QPixmapCache.find()DeprecationWarning?

如何检测pyside2中的Qwebengine内部的按钮单击