PyQt5 QTableWidget Щелкните ячейку, чтобы получить положение текста и положение кнопки.

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_())

3. Эффект

вставьте сюда описание изображения

おすすめ

転載: blog.csdn.net/qq_30841655/article/details/125017742
おすすめ