如何将标签文本动态发送到连接的onclick函数

问题描述

我在Pyside2中创建了一个左侧区域,在其中我在单个标签内列出了一些项目。 然后将click事件连接到在右侧面板上创建标签的函数。

但是我不知道如何动态地将任何单击标签的文本传递给连接的函数。 使用for循环打印项目。传递给连接函数的文本始终是最后打印的标签的文本值。

enter image description here

是否可以获取单击标签的文本并将其传递给连接的功能?

.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1062</width>
    <height>591</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <widget class="QScrollArea" name="scrollArea1">
      <property name="widgetResizable">
       <bool>true</bool>
      </property>
      <widget class="QWidget" name="scrollAreaWidgetContents">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>517</width>
         <height>530</height>
        </rect>
       </property>
       <widget class="QWidget" name="verticalLayoutWidget">
        <property name="geometry">
         <rect>
          <x>9</x>
          <y>9</y>
          <width>501</width>
          <height>511</height>
         </rect>
        </property>
        <layout class="QVBoxLayout" name="verticalLayout"/>
       </widget>
      </widget>
     </widget>
    </item>
    <item>
     <widget class="QTabWidget" name="tabWidget">
      <property name="tabsClosable">
       <bool>true</bool>
      </property>
      <property name="movable">
       <bool>true</bool>
      </property>
      <widget class="QWidget" name="tab">
       <attribute name="title">
        <string>Tab 1</string>
       </attribute>
      </widget>
      <widget class="QWidget" name="tab_2">
       <attribute name="title">
        <string>Tab 2</string>
       </attribute>
      </widget>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1062</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Python代码:

from PySide2.QtWidgets import QApplication,QMainWindow,QFileDialog,\
    QMessageBox,QLabel,QWidget,QVBoxLayout,QScrollArea,QSplitter,\
    QTabWidget,QComboBox
from PySide2.QtCore import Signal,QMetaObject,QFile,QTextStream,\
    QEvent,QObject
from PySide2.QtUiTools import QUiLoader
from PySide2 import QtCore,QtWidgets,QtUiTools

import sys
import os

exePath = os.path.dirname(os.path.realpath(__file__))

class UiLoader(QUiLoader):
    def __init__(self,baseinstance,customWidgets=None):
        QUiLoader.__init__(self,baseinstance)
        self.baseinstance = baseinstance
        self.customWidgets = customWidgets

    def createWidget(self,class_name,parent=None,name=''):
        if parent is None and self.baseinstance:
            return self.baseinstance

        else:
            if class_name in self.availableWidgets():
                widget = QUiLoader.createWidget(self,parent,name)

            else:
                try:
                    widget = self.customWidgets[class_name](parent)

                except (TypeError,KeyError):
                    raise Exception('No custom widget '
                                    + class_name
                                    + ' found in customWidgets param of'
                                    + 'UiLoader __init__.')

            if self.baseinstance:
                setattr(self.baseinstance,name,widget)
            return widget


def loadUi(uifile,baseinstance=None,customWidgets=None,workingDirectory=None):
    loader = UiLoader(baseinstance,customWidgets)
    if workingDirectory is not None:
        loader.setWorkingDirectory(workingDirectory)
    widget = loader.load(uifile)
    QMetaObject.connectSlotsByName(widget)
    return widget


def clickable(widget):
    class Filter(QObject):
        clicked = Signal()

        def eventFilter(self,obj,event):
            if obj == widget:
                if event.type() == QEvent.MouseButtonRelease:
                    if obj.rect().contains(event.pos()):
                        self.clicked.emit()

                        return True
            return False

    filter = Filter(widget)
    widget.installEventFilter(filter)
    return filter.clicked
    
    
class test(QMainWindow):
    def __init__(self):
        super(test,self).__init__()
        loadUi(os.path.join(exePath,'test.ui'),self)    
        self.projects = ('project1','project2','project3','project4')       

        self.scrollarea = self.findChild(QScrollArea,"scrollArea1")
        self.scrollarea.setWidgetResizable(True)

        self.tabWidget1 = self.findChild(QTabWidget,"tabWidget")
        self.tabWidget1.tabCloseRequested.connect(lambda index: self
                                                  .tabWidget1.removeTab(index))
        self.tabWidget1.removeTab(1)
        self.tabWidget1.removeTab(0)   

        widget = QWidget()
        self.scrollarea.setWidget(widget)
        self.layout_SArea = QVBoxLayout(widget)

        self.printProjects()
        
    def printProjects(self):
        for project in self.projects:
            tempLabel = QLabel()
            tempLabel.setText(project)            
            tempLabel.resize(100,10)
            tempLabel.setStyleSheet("QLabel::hover"
                                    "{"
                                    "background-color : lightgreen;"
                                    "}")
            clickable(tempLabel).connect(lambda:
                                             self.hovered(project))

            self.layout_SArea.addWidget(tempLabel)
            self.layout_SArea.addStretch(1)

    def hovered(self,tabText):
        self.tabWidget1.addTab(QWidget(),tabText)

    
if __name__ == "__main__":
    app = QApplication([])
    window = test()
    window.show()
    sys.exit(app.exec_())

感谢@musicamante。 解决方案是更换:

clickable(tempLabel).connect(lambda: self.hovered(project))

具有:

clickable(tempLabel).connect(lambda project=project: self.hovered(project))

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...