簡體   English   中英

PyQt5使動態小部件可單擊並將參數傳遞給另一個函數

[英]PyQt5 making dynamic widgets clickable and pass arguments to another function

我正在嘗試制作動態小部件並使它們可單擊。 通過單擊一個小部件,它應該將動態值傳遞給其他小部件。 我嘗試了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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM