PyQt QTableWidgetItemの実験

PyQt QTableWidgetItemの実験

仕様

  • コード実行時にQTableWidgetとQTableWidgetItemを生成
  • QTableWidget内のボタンをクリックするとボタンとその行の色などを変える
    • Itemを編集しているのではなく同じ内容を保持して色だけを変えたItemで上書きしているイメージ
    • Itemの中身を読みだすところは上手いこと整合が必要

サンプルソースコード

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(828, 656)
        self.tableWidget = QtWidgets.QTableWidget(Form)
        self.tableWidget.setGeometry(QtCore.QRect(40, 50, 621, 511))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setRowCount(50)

        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)



        for i in range(5):
            self.btn = QtWidgets.QPushButton()
            self.btn.setText("未")
            self.tableWidget.setCellWidget(i,0,self.btn)
            self.btn.clicked.connect(Form.btn_click)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("Form", "0"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("Form", "1"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("Form", "2"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("Form", "3"))


class main(QtWidgets.QDialog):

    def __init__(self,parent=None):
        super(main, self).__init__(parent) 
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        for i in range(3):
            self.ui.tableWidget.setItem(0,i+1,QtWidgets.QTableWidgetItem("a"+str(i)))
        for j in range(3):
            self.ui.tableWidget.setItem(1,j+1,QtWidgets.QTableWidgetItem("b"+str(j)))
        for k in range(3):
            self.ui.tableWidget.setItem(2,k+1,QtWidgets.QTableWidgetItem("c"+str(k)))
            

    def btn_click(self):
        state = self.sender()
        index = self.ui.tableWidget.indexAt(state.pos())
        if index.isValid():
            print(index.row(), index.column())
        self.btn_sub = QtWidgets.QPushButton()
        self.btn_sub.setText("完了")
        self.btn_sub.setStyleSheet('QPushButton {background-color: #FF0000; color: white;}')
        self.ui.tableWidget.setCellWidget(index.row(),index.column(),self.btn_sub)

        #値取得
        row =index.row()
        column_cnt = self.ui.tableWidget.columnCount()
        get_list =[]
        for i in range(column_cnt - 1):
            get_list.append(self.ui.tableWidget.item(row,i+1).text())
        print(get_list)

        #値と色を上書き
        for j in range(column_cnt-1):
            item = QtWidgets.QTableWidgetItem()
            item.setBackground(QtGui.QColor(0, 255, 0))
            print(j)
            item.setText(get_list[j])
            self.ui.tableWidget.setItem(row,j+1,item)




if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = main()
    window.show()
    
    sys.exit(app.exec_())

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です