Оглавление
1. Спрос
Интерфейс реализует следующие требования: в таблице есть текстовая информация, одна кнопка и несколько кнопок,
а) щелчок по ячейке таблицы возвращает позицию и текстовую информацию ячейки
б) щелчок по ячейке таблицы возвращает информацию о позиции одиночная кнопка
c. щелчок по ячейке таблицы возвращает информацию о положении многокнопочной кнопки
2. Осознайте
Обратитесь к блогу «Конкретный метод использования QTableWidget для расширенного управления интерфейсом PyQt5 » . выбранная ячейка"
прямо в код
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
class NewTableWidget(QWidget):
def __init__(self):
super(NewTableWidget, self).__init__()
self.resize(800,300)
self.setWindowTitle('例子')
# 表头标签
heaerlabels = ['标题1','标题2']
# 行数和列数
self.rowsnum, self.columnsnum = 2, len(heaerlabels) #默认2行2列
self.TableWidget=QTableWidget(self.rowsnum,self.columnsnum)
#todo 优化 2 设置水平方向表格为自适应的伸缩模式
self.TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.TableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
#Todo 优化 5 将行与列的高度设置为所显示的内容的宽度高度匹配
QTableWidget.resizeColumnsToContents(self.TableWidget)
QTableWidget.resizeRowsToContents(self.TableWidget)
#设置水平方向的表头标签与垂直方向上的表头标签,注意必须在初始化行列之后进行,否则,没有效果
self.TableWidget.setHorizontalHeaderLabels(heaerlabels)
#Todo 优化1 设置垂直方向的表头标签
#TableWidget.setVerticalHeaderLabels(['行1', '行2', '行3', '行4'])
# 添加单元格初始化内容
for i in range(self.rowsnum):
for j in range(self.columnsnum-1):
newItem=QTableWidgetItem('数据'+str(i)+','+str(j))
newItem.setTextAlignment(Qt.AlignCenter)
self.TableWidget.setItem(i,j,newItem)
# 添加单按钮
self.singlebtn = QPushButton("单按钮")
self.TableWidget.setCellWidget(0, self.columnsnum-1, self.singlebtn)
# 单按钮联动
self.singlebtn.clicked.connect(self.single_loc) # 返回按钮位置信息
# 添加双按钮
self.doublebtn1 = QPushButton("双按钮1")
self.doublebtn2 = QPushButton("双按钮2")
mywidget = QWidget()
hlayout = QHBoxLayout()
hlayout.addWidget(self.doublebtn1)
hlayout.addWidget(self.doublebtn2)
mywidget.setLayout(hlayout)
self.TableWidget.setCellWidget(1, self.columnsnum-1, mywidget)
# 双按钮联动
self.doublebtn1.clicked.connect(self.double0_loc) # 返回按钮位置信息
self.doublebtn2.clicked.connect(self.double1_loc) # 返回按钮位置信息
#self.TableWidget.update()
#表格中不显示分割线
#TableWidget.setShowGrid(False)
#隐藏垂直头标签
#TableWidget.verticalHeader().setVisible(False)
layout = QHBoxLayout()
layout.addWidget(self.TableWidget)
self.setLayout(layout)
# 返回文本
self.TableWidget.itemClicked.connect(self.show_data)
def single_loc(self):
button = self.sender()
if button:
# 确定位置的时候这里是关键
row = self.TableWidget.indexAt(button.pos()).row()
column = self.TableWidget.indexAt(button.pos()).column()
#self.tableWidget.removeRow(row)
print('单按钮位置: ', row, column)
def double0_loc(self):
button = self.sender()
if button:
# 确定位置的时候这里是关键
row = self.TableWidget.indexAt(button.parent().pos()).row()
column = self.TableWidget.indexAt(button.parent().pos()).column()
#self.tableWidget.removeRow(row)
print('双按钮1位置: ', row, column, 0)
def double1_loc(self):
button = self.sender()
if button:
# 确定位置的时候这里是关键
row = self.TableWidget.indexAt(button.parent().pos()).row()
column = self.TableWidget.indexAt(button.parent().pos()).column()
#self.tableWidget.removeRow(row)
print('双按钮2位置: ', row, column, 1)
# 自定义槽函数 show_data()
# 这里会接收到被点击的单元格对象参数
def show_data(self, Item=None):
# 如果单元格对象为空
if Item is None:
return
else:
row = Item.row() # 获取行数
col = Item.column() # 获取列数 注意是column而不是col哦
text = Item.text() # 获取内容
# 输出测试
print('row = ',row)
print('col =', col)
print('text = ',text)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = NewTableWidget()
win.show()
sys.exit(app.exec_())