how to connect two QTableview Widgets?

半腔热情 提交于 2019-12-07 18:57:20

You have to detect the change of the corresponding item of the second QTableView, get the row of that item to be able to set the background color of the corresponding item of the first QTableView.

import sys
from PyQt5 import QtCore as qtc
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg


class QTableWidgetDisabledItem(qtw.QItemDelegate):
    def createEditor(self, parent, option, index):
        return


class MainWindow(qtw.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.createUI()

    def createUI(self):

        self.Statusbar = qtw.QTableView(
            editTriggers=qtw.QAbstractItemView.NoEditTriggers
        )
        self.statusbar_model = qtg.QStandardItemModel(self)
        self.Statusbar.setModel(self.statusbar_model)
        self.Statusbar.setFixedHeight(70)

        self.tableWidget = qtw.QTableView(
            selectionBehavior=qtw.QAbstractItemView.SelectRows
        )
        self.tableWidget.setGeometry(0, 0, 100, 100)
        self.model = qtg.QStandardItemModel(self)
        self.model.setHorizontalHeaderLabels(["ID", "Category", "Time", "Comment"])
        self.tableWidget.setModel(self.model)
        for i in range(3):
            delegate = QTableWidgetDisabledItem(self.tableWidget)
            self.tableWidget.setItemDelegateForColumn(i, delegate)

        self.model.itemChanged.connect(self.on_itemChanged)

        self.resize(qtc.QSize(1200, 800))
        base_widget = qtw.QWidget()
        self.setCentralWidget(base_widget)
        notebook = qtw.QVBoxLayout()
        notebook.setSpacing(10)
        notebook.setContentsMargins(0, 0, 0, 0)
        notebook.addWidget(self.Statusbar, alignment=qtc.Qt.AlignTop)
        lay = qtw.QHBoxLayout(base_widget)
        lay.addLayout(notebook)
        self.file_list = qtw.QVBoxLayout()
        self.file_list.addWidget(self.tableWidget)
        lay.addLayout(self.file_list)

        self.populate()

    def populate(self):
        # emulate populate
        self.model.setRowCount(26)
        self.statusbar_model.setRowCount(1)
        self.statusbar_model.setColumnCount(self.model.rowCount())

    @qtc.pyqtSlot("QStandardItem*")
    def on_itemChanged(self, item):
        if item.column() == 3:
            it = self.statusbar_model.item(0, item.row())
            if it is None:
                it = qtg.QStandardItem()
                self.statusbar_model.setItem(0, item.row(), it)
            brush = (
                qtg.QBrush(qtg.QColor("red")) if item.text().strip() else qtg.QBrush()
            )
            it.setBackground(brush)


if __name__ == "__main__":
    app = qtw.QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!