gpt4 book ai didi

python - PyQt5 使动态小部件可点击并将参数传递给另一个函数

转载 作者:行者123 更新时间:2023-12-01 02:32:03 26 4
gpt4 key购买 nike

我正在尝试制作动态小部件并使它们可点击。通过单击一个小部件,它应该将动态值传递给其他小部件。我尝试过 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)

关于python - PyQt5 使动态小部件可点击并将参数传递给另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46696362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com