PyQt5使动态窗口小部件可单击并将参数传递给另一个函数

S_Ymln

我正在尝试制作动态小部件并使它们可单击。通过单击一个小部件,它应该将动态值传递给其他小部件。我尝试了sender()和其他访问小部件的选项,但没有任何效果。所有小部件都从上一个小部件发送信息。

下面是代码:

import sys
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QLabel, QMessageBox,QSizePolicy, QLayoutItem,QFrame,QHBoxLayout, QGridLayout, QVBoxLayout
from PyQt5.QtCore import QCoreApplication,QSize,QFileInfo
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from functools import partial
from PyQt5.QtCore import pyqtSlot
import sip 


class Screen(QWidget):
    def __init__(self):

        super(Screen, self).__init__()

        self.running_layout = QVBoxLayout()
        self.action_layout = QVBoxLayout()
        self.layout = QHBoxLayout(self)
        self.layout.addLayout(self.running_layout)
        self.layout.addLayout(self.action_layout)
        self.setLayout(self.layout)
        self.show()
        self.all_running()        
        self.actions_1('1')
    def buttonClicked(self):      
        sender = self.sender()
        print(sender + ' was pressed')

    def all_running(self):
        for i in range(5):
            button = QLabel("btn "+str(i))
            button.mouseReleaseEvent = lambda _ : self.actions_1(str(button.text()).split()[1])
            self.running_layout.addWidget(button)


        button2 = QLabel("btn 5")
        button2.mouseReleaseEvent = lambda _ : self.actions_1(str(button2.text()).split()[1])        
        self.running_layout.addWidget(button2)


    def actions_1(self,value):

        while not self.action_layout.isEmpty():
            print(self.action_layout.isEmpty())
            widget = self.action_layout.itemAt(0).widget()
            print("removing", widget)
            widget.setVisible(False)
            self.action_layout.removeWidget(widget)
            del widget
        self.action_layout = QVBoxLayout()
        self.layout.addLayout(self.action_layout)
        val = int(value)

        for i in range(val):
            actions_item = QLabel(str(i))
            self.action_layout.addWidget(actions_item)

app = QApplication(sys.argv)
Gui = Screen()
sys.exit(app.exec_())

编辑:我试图基于一些小部件需要填充的int值将int传递给操作。此int基于我使用for循环生成的动态窗口小部件。例如,如果单击running_layout“ btn 0”的第一个小部件,则action_layout中将没有任何小部件,如果单击running_layout“ btn 1”的第二个小部件,则action_layout中将有一个小部件“ 0”,依此类推基于小部件编号。我能够发送信号,但是无论单击哪个动态创建的小部件,它都会将最后一个小部件“ btn 4”的值4发送到action_layout。

永乐

为了简化任务,我们将创建2个小部件,第一个将ClickableWidget具有一个信号,该信号指示与小部件相关联的编号,而第二个DynamicWidget将具有负责更新小部件数量的方法。

要知道,如果一个元素被按下时,我们使用的方法installEventFilter()eventFilter(),该过滤器给对象和事件的信息的事件,我们将使用setProperty("index", )存储的号码。

在第二个小部件中,我实现了一种方法,该方法负责清理小部件并创建一些新的小部件。

class ClickableWidget(QWidget):
    clicked = pyqtSignal(int)
    def  __init__(self, n=5, parent=None):
        QWidget.__init__(self, parent)
        self.hlayout = QVBoxLayout(self)
        for i in range(n):
            label = QLabel("btn {}".format(i), self)
            label.setProperty("index", i)
            self.hlayout.addWidget(label)
            label.installEventFilter(self)

    def eventFilter(self, obj, event):
        if isinstance(obj, QLabel) and event.type() == QEvent.MouseButtonPress:
            i = obj.property("index") 
            self.clicked.emit(i)
        return QWidget.eventFilter(self, obj, event)

class DynamicWidget(QWidget):
    def  __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.hlayout = QVBoxLayout(self)

    def changeWidget(self, n):
        def clearLayout(layout):
            item = layout.takeAt(0)
            while item:
                w = item.widget()
                if w:
                    w.deleteLater()
                lay = item.layout()
                if lay:
                    clearLayout(item.layout())
                item = layout.takeAt(0)

        clearLayout(self.hlayout)
        for i in range(n):
            label = QLabel("btn {}".format(i), self)
            self.hlayout.addWidget(label)


class Screen(QWidget):
    def __init__(self):
        super(Screen, self).__init__()
        self.layout = QHBoxLayout(self)
        c = ClickableWidget(6, self)
        d = DynamicWidget(self)
        c.clicked.connect(d.changeWidget)
        self.layout.addWidget(c)
        self.layout.addWidget(d)

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将参数传递给另一个函数

将一个函数的所有参数传递给另一个函数

调整窗口大小时,PyQt5仅调整一个子窗口小部件的大小

Python 3:如何从另一个文件调用函数并将参数传递给该函数?

如何将小部件构造函数作为参数传递给另一个小部件来构建

迭代参数,调用方法并将结果传递给另一个函数

当另一个函数运行时,禁止单击事件在窗口小部件上排队

将参数传递给按钮单击到另一个按钮单击-jQuery

将Cupertino Datepicker传递给另一个小部件

成功登录PyQt5 Python3后打开另一个窗口

将一个函数传递给另一个函数的参数

通过另一个窗口小部件单击事件?

在另一个窗口小部件包含的窗口小部件中绘图

C ++-将数组返回主函数并将数组传递给另一个函数

如何将对象的动态数组传递给另一个类的参数化构造函数?

从另一个函数 A 关闭 Tkinter GUI 并将 Tkinter 变量传递给函数 A

如何使用动态数量的参数创建 PowerShell 函数,每个参数都将传递给另一个命令?

如何将上下文传递给另一个小部件?

如何将数据传递给另一个小部件内的小部件

如何在 PyQt5 中用另一个小部件替换小部件

PyQt5,将变量列表传递给另一个类

将一个函数传递给另一个参数未知的函数

将一个小部件的值(年龄)传递给另一个小部件

tkinter-将条目小部件值传递给另一个类

PHP 将一个函数作为参数传递给另一个函数

将函数参数动态传递给另一个函数

C++ 元编程来拆分函数参数并将它们一个一个地传递给另一个函数

一个函数作为参数传递给另一个函数

如何在单击另一个小部件的按钮时显示小部件