как работать с сигналами из ячейки QTableWidget с помощью cellWidget - PullRequest
1 голос
/ 13 июля 2020

Я работал над QTableWidget, вопрос в том, была ли ячейка установлена ​​с помощью QTableWidgetItem, сигнал 'itemChanged' работает хорошо, что позволяет легко получить строку / столбец / текст, но если ячейка была установлена ​​с помощью cellWidget, например QLineEdit, тогда singal 'itemChanged' не 't work, singal' textChanged 'или еще из самого QLineEdit работает, но это слишком сложно, если сотни QLineEdit, можно ли работать как itemChanged? пожалуйста, помогите, спасибо.

Код, как показано ниже:

import sys
from PyQt5.QtWidgets import *

class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("QTableWidget Example")
        self.resize(400,300)
        self.layout=QHBoxLayout()
        self.TableWidget=QTableWidget(4,3)


        self.TableWidget.setHorizontalHeaderLabels(['Nmae','Sex','Weight(kG)'])

        # self.newItem=QTableWidgetItem('Jack')
        # self.TableWidget.setItem(0,0,self.newItem)

        # self.newItem=QTableWidgetItem('Male')
        # self.TableWidget.setItem(0,1,self.newItem)

        # self.newItem=QTableWidgetItem('160')
        # self.TableWidget.setItem(0,2,self.newItem)

        self.newItem=QLineEdit('Jack')        
        self.TableWidget.setCellWidget(0,0,self.newItem)        
        self.newItem.textChanged.connect(self.txtChange)

        self.newItem=QLineEdit('Male')        
        self.TableWidget.setCellWidget(0,1,self.newItem)        

        self.newItem=QLineEdit('160')        
        self.TableWidget.setCellWidget(0,2,self.newItem)        

        self.layout.addWidget(self.TableWidget)

        self.setLayout(self.layout)
        self.TableWidget.itemChanged.connect(self.changeTest)

    def changeTest(self,item):
        # print('test')
        print(item.text())

    def txtChange(self,txt):
        print(txt)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=Table()
    win.show()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 13 июля 2020

Одно из возможных решений - не использовать cellWidget, а постоянно открывать редакторы делегатов:

class StyledItemDelegate(QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        return QLineEdit(parent)


class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget Example")
        self.resize(400, 300)

        self.tableWidget = QTableWidget(4, 3)
        delegate = StyledItemDelegate(self)
        self.tableWidget.setItemDelegate(delegate)

        self.tableWidget.setHorizontalHeaderLabels(["Nmae", "Sex", "Weight(kG)"])
        self.tableWidget.itemChanged.connect(self.changeTest)

        lay = QHBoxLayout(self)
        lay.addWidget(self.tableWidget)

        it = QTableWidgetItem("Jack")
        self.tableWidget.setItem(0, 0, it)
        self.tableWidget.openPersistentEditor(it)

        it = QTableWidgetItem("Male")
        self.tableWidget.setItem(0, 1, it)
        self.tableWidget.openPersistentEditor(it)

        it = QTableWidgetItem("160")
        self.tableWidget.setItem(0, 2, it)
        self.tableWidget.openPersistentEditor(it)

    def changeTest(self, item):
        print(item.text())
...