问题描述
我在Pyside2中创建了一个左侧区域,在其中我在单个标签内列出了一些项目。 然后将click事件连接到在右侧面板上创建标签的函数。
但是我不知道如何动态地将任何单击标签的文本传递给连接的函数。 使用for循环打印项目。传递给连接函数的文本始终是最后打印的标签的文本值。
是否可以获取单击标签的文本并将其传递给连接的功能?
.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 (将#修改为@)