사용자 정의 QAbstractTableModel을 사용하여 Qtableview를 만든 후 셀에 색상을 지정하는 방법

수팡

아래에 표시된 QAbstractTableModel을 기반으로 'pandasModel'클래스를 만듭니다.

import sys
from PyQt5.QtGui     import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *
class pandasModel(QAbstractItemModel):

    def __init__(self, data, parent=None):
        QAbstractItemModel.__init__(self, parent)
        self._data = data

    def rowCount(self, parent=None):
        return self._data.index.size

    def columnCount(self, parent=None):
        return self._data.columns.size

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
            if role == Qt.EditRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, rowcol, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[rowcol]
        if orientation == Qt.Vertical and role == Qt.DisplayRole:
            return self._data.index[rowcol]
        return None

    def flags(self, index):
        flags = super(self.__class__, self).flags(index)
        flags |= Qt.ItemIsEditable
        flags |= Qt.ItemIsSelectable
        flags |= Qt.ItemIsEnabled
        flags |= Qt.ItemIsDragEnabled
        flags |= Qt.ItemIsDropEnabled
        return flags

    def sort(self, Ncol, order):
        """Sort table by given column number.
        """
        try:
            self.layoutAboutToBeChanged.emit()
            self._data = self._data.sort_values(self._data.columns[Ncol], ascending=not order)
            self.layoutChanged.emit()
        except Exception as e:
            print(e)

또한 아래에 표시된 모델을 표시하기 위해 QTableView를 만듭니다.

class TableWin(QWidget):
    pos_updown = -1
    pos_save = []

    def __init__(self):
        super(TableWin, self).__init__()
        self.resize(200, 100)
        self.table = QTableView(self)
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.table)
        self.setLayout(self.v_layout)
        self.showdata()

    def showdata(self):
        data = pd.DataFrame([[1,2,3,4],[5,6,7,8]])
        model = pandasModel(data)
        self.table.setModel(model)

    def set_cell_color(self, row, column)
        '''
          Pass two arguments to this function, which is called to set
          the background color of the cell corresponding to the row and column
        '''
if __name__ == '__main__':
    app = QApplication(sys.argv)
    tableView = TableWin()
    # I want to change cell's color by call function 'set_cell_color' here
    # tableView.set_cell_color(row=1,column=1) 
    tableView.show()
    sys.exit(app.exec_())

이제 QTableview에서 데이터를 표시 할 수 있지만 질문은 'set_cell_color'함수를 호출하여 주어진 행과 열이있는 셀의 배경색을 설정하는 방법입니다. def set_cell_color에서 코드를 완료하는 방법을 알려주세요.

일단 QStandardItemModel과 마찬가지로 'model.item (row, col) .setBackground (QColor (240, 255, 240))'을 사용하여 셀의 색상을 설정하고 싶지만 오류 ''model '에는'item '속성이 없습니다.

이 링크는 셀의 색상을 설정하는 방법을 보여줍니다

코드는 다음과 같습니다.

import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class Model(QAbstractTableModel):
    def __init__(self, parent=None):
        super(Model, self).__init__(parent)
        self._data = [[['%d - %d' % (i, j), False] for j in range(10)] for i in range(10)]

    def rowCount(self, parent):
        return len(self._data)

    def columnCount(self, parent):
        return len(self._data[0])

    def flags(self, index):
        return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable

    def data(self, index, role):
        if index.isValid():
            data, changed = self._data[index.row()][index.column()]

        if role in [Qt.DisplayRole, Qt.EditRole]:
            return data

        if role == Qt.BackgroundRole and data == "In error":        # <---------
            return QBrush(Qt.red) 

    def setData(self, index, value, role):
        if role == Qt.EditRole:
            self._data[index.row()][index.column()] = [value, True]
            self.dataChanged.emit(index, index)
            return True
        return False

if __name__ == '__main__':
    app = QApplication(sys.argv)
    tableView = QTableView()
    m = Model(tableView)
    tableView.setModel(m)
    tableView.show()
    sys.exit(app.exec_())

'데이터'함수에서 'return QBrush (Qt.red)'를 사용하면 '오류 있음'값으로 셀의 배경색을 설정할 수 있지만 Qtableview가 생성 될 때 배경색이 이미 설정되어 있으므로 설정하고 싶습니다. 'set_cell_color'함수를 호출 할 때 셀의 배경색, 즉 Qtableview가 이미 생성 된 후에도 셀의 배경을 제어 할 수 있다는 의미입니다. 도움을 주셔서 감사합니다.

Eyllanesc

논리는 항목의 위치와 항목의 색상을 연결하는 정보를 모델에 저장하고이를 업데이트하려면 dataChanged 신호를 내 보내야합니다.

참고 : 모델은 테이블 유형이므로 QAbstractItemModel이 아닌 QAbstractTableModel에서 상속해야합니다.

위의 내용을 고려할 때 해결책은 다음과 같습니다.

class pandasModel(QAbstractTableModel):
    def __init__(self, data, parent=None):
        QAbstractItemModel.__init__(self, parent)
        self._data = data

        self.colors = dict()

    def rowCount(self, parent=None):
        return self._data.index.size

    def columnCount(self, parent=None):
        return self._data.columns.size

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
            if role == Qt.EditRole:
                return str(self._data.iloc[index.row(), index.column()])
            if role == Qt.BackgroundRole:
                color = self.colors.get((index.row(), index.column()))
                if color is not None:
                    return color
        return None

    def headerData(self, rowcol, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[rowcol]
        if orientation == Qt.Vertical and role == Qt.DisplayRole:
            return self._data.index[rowcol]
        return None

    def flags(self, index):
        flags = super(self.__class__, self).flags(index)
        flags |= Qt.ItemIsEditable
        flags |= Qt.ItemIsSelectable
        flags |= Qt.ItemIsEnabled
        flags |= Qt.ItemIsDragEnabled
        flags |= Qt.ItemIsDropEnabled
        return flags

    def sort(self, Ncol, order):
        """Sort table by given column number.
        """
        try:
            self.layoutAboutToBeChanged.emit()
            self._data = self._data.sort_values(
                self._data.columns[Ncol], ascending=not order
            )
            self.layoutChanged.emit()
        except Exception as e:
            print(e)

    def change_color(self, row, column, color):
        ix = self.index(row, column)
        self.colors[(row, column)] = color
        self.dataChanged.emit(ix, ix, (Qt.BackgroundRole,))


class TableWin(QWidget):
    pos_updown = -1
    pos_save = []

    def __init__(self):
        super(TableWin, self).__init__()
        self.resize(200, 100)
        self.table = QTableView(self)
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.table)
        self.setLayout(self.v_layout)
        self.showdata()

    def showdata(self):
        data = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]])
        self.model = pandasModel(data)
        self.table.setModel(self.model)

    def set_cell_color(self, row, column):
        self.model.change_color(row, column, QBrush(Qt.red))

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

pyqt에서 Qtableview / QAbstractTableModel을 사용하여 사용자 지정 데이터를 저장하고 검색하는 방법 (QtCore.Qt.UserRole? 사용)?

분류에서Dev

후크를 사용하여 Liferay 5.2.3에서 사용자 지정 로그인 작업을 만드는 방법

분류에서Dev

VBScript를 사용하여 ActiveDirectory의 지정된 그룹에서 지정된 사용자의 모든 속성을 검색하는 방법은 무엇입니까?

분류에서Dev

VSTO를 사용하여 만든 MS Word 표의 셀에 숫자 형식을 추가하는 방법

분류에서Dev

VSTO를 사용하여 만든 MS Word 표의 셀에 숫자 형식을 추가하는 방법

분류에서Dev

API를 사용하여 AEM에서 사용자 지정 사용자 그룹을 만드는 방법

분류에서Dev

matplotlib에 설정된 사용자 정의 번호를 사용하여 막대의 색상을 사용자 정의하는 방법은 무엇입니까?

분류에서Dev

사용자 정의 색상을 사용하여 gnuplot 색상 상자를 변경하는 방법

분류에서Dev

Sencha touch의 Ext.ux.touchcalendar에서 CSS를 사용하여 특정 셀 색상을 변경하는 방법

분류에서Dev

CSS를 사용하여 컨테이너의 특정 단어에 색상을 지정하는 방법

분류에서Dev

Swift를 사용하여 UITableview에서 사용자 지정 셀 (Xib)을로드하는 방법

분류에서Dev

MVC에서 사용자 지정 라우팅을 사용하여 사용자 지정 URL을 만드는 방법

분류에서Dev

정규식을 사용하여 자릿수를 제한하지만 앞에 0을 허용하는 방법

분류에서Dev

Python에서 raw_input ()을 사용하여 특정 문자 이후 사용자의 입력 읽기를 중지하는 방법은 무엇입니까?

분류에서Dev

자바를 사용하여 위의 셀 값을 사용하여 모든 빈 셀을 채우는 방법

분류에서Dev

nestjs에서 globalPipse를 사용하여 사용자 지정 응답을 만드는 방법

분류에서Dev

jquery를 사용하여 XML 파일에서 사용자 지정 데이터 목록을 만드는 방법

분류에서Dev

setTimeout 메서드를 사용하여 지정된 시간 이후에 캐 러셀을 이동하는 방법은 무엇입니까? 자바 스크립트

분류에서Dev

16 진수를 사용하여 사용자 지정 숫자 서식 색상을 변경하는 방법

분류에서Dev

튜플 값에 대한 사용자 지정 비교기를 사용하여 사전의 정렬 된 표현을 만드는 방법은 무엇입니까?

분류에서Dev

NextJS : 사용자 지정 후크에서 창을 사용하는 방법?

분류에서Dev

fillStyle을 사용하여 다른 개체에 색상을 지정하는 방법

분류에서Dev

두 개의 서로 다른 바인딩을 사용하여 사용자 지정 ListView에서 모든 정보를 얻는 방법은 무엇입니까?

분류에서Dev

후행 텍스트가있는 셀의 사용자 지정 형식을 hr / hrs로 설정하는 방법.?

분류에서Dev

peewee를 사용하여 모델에 정의 된 모든 테이블을 만드는 방법

분류에서Dev

WPF를 사용하지 않고 Silverlight 5에서 generic.xaml을 사용하여 사용자 지정 컨트롤을 만드는 방법은 무엇입니까?

분류에서Dev

iOS의 UITableView에서 사용자 지정 셀에 대한 모든 기능을 선택하는 방법

분류에서Dev

CSS 가상 요소를 사용하여 사용자 지정 도구 설명을 만드는 방법

분류에서Dev

명령에서 사용자 정의 변수를 활용하여 if에서 조건을 만드는 방법

Related 관련 기사

  1. 1

    pyqt에서 Qtableview / QAbstractTableModel을 사용하여 사용자 지정 데이터를 저장하고 검색하는 방법 (QtCore.Qt.UserRole? 사용)?

  2. 2

    후크를 사용하여 Liferay 5.2.3에서 사용자 지정 로그인 작업을 만드는 방법

  3. 3

    VBScript를 사용하여 ActiveDirectory의 지정된 그룹에서 지정된 사용자의 모든 속성을 검색하는 방법은 무엇입니까?

  4. 4

    VSTO를 사용하여 만든 MS Word 표의 셀에 숫자 형식을 추가하는 방법

  5. 5

    VSTO를 사용하여 만든 MS Word 표의 셀에 숫자 형식을 추가하는 방법

  6. 6

    API를 사용하여 AEM에서 사용자 지정 사용자 그룹을 만드는 방법

  7. 7

    matplotlib에 설정된 사용자 정의 번호를 사용하여 막대의 색상을 사용자 정의하는 방법은 무엇입니까?

  8. 8

    사용자 정의 색상을 사용하여 gnuplot 색상 상자를 변경하는 방법

  9. 9

    Sencha touch의 Ext.ux.touchcalendar에서 CSS를 사용하여 특정 셀 색상을 변경하는 방법

  10. 10

    CSS를 사용하여 컨테이너의 특정 단어에 색상을 지정하는 방법

  11. 11

    Swift를 사용하여 UITableview에서 사용자 지정 셀 (Xib)을로드하는 방법

  12. 12

    MVC에서 사용자 지정 라우팅을 사용하여 사용자 지정 URL을 만드는 방법

  13. 13

    정규식을 사용하여 자릿수를 제한하지만 앞에 0을 허용하는 방법

  14. 14

    Python에서 raw_input ()을 사용하여 특정 문자 이후 사용자의 입력 읽기를 중지하는 방법은 무엇입니까?

  15. 15

    자바를 사용하여 위의 셀 값을 사용하여 모든 빈 셀을 채우는 방법

  16. 16

    nestjs에서 globalPipse를 사용하여 사용자 지정 응답을 만드는 방법

  17. 17

    jquery를 사용하여 XML 파일에서 사용자 지정 데이터 목록을 만드는 방법

  18. 18

    setTimeout 메서드를 사용하여 지정된 시간 이후에 캐 러셀을 이동하는 방법은 무엇입니까? 자바 스크립트

  19. 19

    16 진수를 사용하여 사용자 지정 숫자 서식 색상을 변경하는 방법

  20. 20

    튜플 값에 대한 사용자 지정 비교기를 사용하여 사전의 정렬 된 표현을 만드는 방법은 무엇입니까?

  21. 21

    NextJS : 사용자 지정 후크에서 창을 사용하는 방법?

  22. 22

    fillStyle을 사용하여 다른 개체에 색상을 지정하는 방법

  23. 23

    두 개의 서로 다른 바인딩을 사용하여 사용자 지정 ListView에서 모든 정보를 얻는 방법은 무엇입니까?

  24. 24

    후행 텍스트가있는 셀의 사용자 지정 형식을 hr / hrs로 설정하는 방법.?

  25. 25

    peewee를 사용하여 모델에 정의 된 모든 테이블을 만드는 방법

  26. 26

    WPF를 사용하지 않고 Silverlight 5에서 generic.xaml을 사용하여 사용자 지정 컨트롤을 만드는 방법은 무엇입니까?

  27. 27

    iOS의 UITableView에서 사용자 지정 셀에 대한 모든 기능을 선택하는 방법

  28. 28

    CSS 가상 요소를 사용하여 사용자 지정 도구 설명을 만드는 방법

  29. 29

    명령에서 사용자 정의 변수를 활용하여 if에서 조건을 만드는 방법

뜨겁다태그

보관