【发布时间】:2019-12-01 04:28:12
【问题描述】:
我想实现可以选择和取消选择 QTableWidget 内的多个 QTableWidgetItem 的功能,以便知道这些 QTableWidgetItem 的值和“位置”以供进一步使用。
QTableWidget 内部有一些空单元格,用于美学/间距,我试图实现的功能应该忽略这些单元格。 但这也可以在事后通过检查所选项目是否有内容来轻松完成。
self.table_widget.itemClicked.connect(self.some_function)
这将是最合适的信号,但我无法指定或知道在表格小部件内单击了哪个项目,或者是被选中还是未选中。
问题:如何实现在按下特定 QTableWidgetItem 时发出特定信号的功能?
这里有一些用于示例的伪代码:
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
uic.loadUi("qtdesignerfile.ui", self)
self.show()
#connect signal to function
self.table_widget.itemClicked.connect(self.some_function)
#create "global" list to save all selected items
self.selected_items = []
#some function to execute the logic
def some_function(self):
#condition distinguishing if item was just selected or unselected
if QTableWidgetItem(row, column) is not already selected:
#change background color to indicate selection
self.table_widget.item(row,column).setBackground(QtGui.QColor(100,100,100))
#"format" information of clicked item for further use
selected_item = [str(table_widget.item(row,column).text()), row, column]
#"save" selected item in global list for further use
self.selected_items.append(selected_item)
#condition distinguishing if item was just selected or unselected
if QTableWidgetItem(row, column) is already selected:
#change background color to indicate un-selection
self.table_widget.item(row,column).setBackground(QtGui.QColor(0,0,0))
#"format" information of clicked item for further use
selected_item = [str(table_widget.item(row,column).text()), row, column]
#remove the un-selected item from global list
self.selected_items.remove(selected_item)
示例 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>418</width>
<height>297</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTableWidget" name="table_widget">
<row>
<property name="text">
<string>Row 1</string>
</property>
</row>
<row>
<property name="text">
<string>Row 2</string>
</property>
</row>
<row>
<property name="text">
<string>Row 3</string>
</property>
</row>
<row>
<property name="text">
<string>Row 4</string>
</property>
</row>
<row>
<property name="text">
<string>Row 5</string>
</property>
</row>
<row>
<property name="text">
<string>Row 6</string>
</property>
</row>
<column>
<property name="text">
<string>Grouping</string>
</property>
</column>
<column>
<property name="text">
<string>Column 2</string>
</property>
</column>
<column>
<property name="text">
<string>Column 3</string>
</property>
</column>
<item row="0" column="0">
<property name="text">
<string>category 1</string>
</property>
</item>
<item row="1" column="1">
<property name="text">
<string>Entry (1,1)</string>
</property>
</item>
<item row="1" column="2">
<property name="text">
<string>Entry(1,2)</string>
</property>
</item>
<item row="2" column="1">
<property name="text">
<string>Entry(2,1)</string>
</property>
</item>
<item row="2" column="2">
<property name="text">
<string>Entry(2,2)</string>
</property>
</item>
<item row="3" column="0">
<property name="text">
<string>category 2</string>
</property>
</item>
<item row="4" column="1">
<property name="text">
<string>Entry(4,1)</string>
</property>
</item>
<item row="4" column="2">
<property name="text">
<string>Entry(4,2)</string>
</property>
</item>
<item row="5" column="1">
<property name="text">
<string>Entry(5,1)</string>
</property>
</item>
<item row="5" column="2">
<property name="text">
<string>Entry(5,2)</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>418</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
我对如何轻松实现此功能感到非常困惑,并对不同方法的建议持开放态度。
应用程序的用户应该能够选择多个QTableWidgetItems,以便将项目所在行的信息转移到另一个QTableWidget以供进一步使用。
【问题讨论】:
-
分享
qtdesignerfile -
好的,那我就用我自己创建的.ui,如果不行,那你就得分析一下问题出在哪里了。我只有一个疑问:QTableWidget 中的项目是有文字还是空的?
-
你能用 QTableWidget 创建一个 .ui 吗?我认为 .ui 会有几行,它也更好地解释了你的意思:用户可能选择一个空项目(空行作为间距)但应该忽略这些
-
@eyllanesc 添加了一个示例 ui 文件
-
@eyllanesc 这些项目应该被我试图实现的功能忽略。
标签: python python-3.x pyqt pyqt5 qtablewidget