프로젝트

일반

사용자정보

통계
| 개정판:

hytos / HYTOS / HYTOS / FreezeTableWidget.py @ f81fb80b

이력 | 보기 | 이력해설 | 다운로드 (6.69 KB)

1
# -*- coding: utf-8 -*-
2
""" This is FreezeTableWidget module """
3

    
4
from PyQt5.QtCore import *
5
from PyQt5.QtGui import *
6
from PyQt5.QtWidgets import *
7

    
8

    
9
class FreezeTableWidget(QTableView):
10
    def __init__(self, parent=None, fixed_col_count=1, *args):
11
        QTableView.__init__(self, parent, *args)
12

    
13
        self._fixed_col_count = fixed_col_count
14
        self._selected_item = None
15
        self.frozenTableView = QTableView(self)
16

    
17
        self.frozenTableView.verticalHeader().hide()
18
        self.frozenTableView.setFocusPolicy(Qt.NoFocus)
19
        self.frozenTableView.setStyleSheet('''border: none; background-color: #CCC''')
20
        self.frozenTableView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
21
        self.frozenTableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
22
        self.frozenTableView.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
23

    
24
        self.viewport().stackUnder(self.frozenTableView)
25

    
26
        self.setShowGrid(True)
27

    
28
        hh = self.horizontalHeader()
29
        hh.setDefaultAlignment(Qt.AlignCenter)
30
        hh.setStretchLastSection(True)
31

    
32
        self.resizeColumnsToContents()
33

    
34
        vh = self.verticalHeader()
35
        vh.setDefaultSectionSize(25)
36
        vh.setDefaultAlignment(Qt.AlignCenter)
37
        vh.setVisible(True)
38
        self.frozenTableView.verticalHeader().setDefaultSectionSize(vh.defaultSectionSize())
39

    
40
        self.frozenTableView.show()
41
        self.updateFrozenTableGeometry()
42

    
43
        self.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
44
        self.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
45
        self.frozenTableView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
46

    
47
        # connect the headers and scrollbars of both table view's together
48
        self.horizontalHeader().sectionResized.connect(self.updateSectionWidth)
49
        self.verticalHeader().sectionResized.connect(self.updateSectionHeight)
50
        self.frozenTableView.verticalScrollBar().valueChanged.connect(self.verticalScrollBar().setValue)
51
        self.verticalScrollBar().valueChanged.connect(self.frozenTableView.verticalScrollBar().setValue)
52

    
53
    @property
54
    def fixed_col_count(self):
55
        return self._fixed_col_count
56

    
57
    @fixed_col_count.setter
58
    def fixed_col_count(self, value):
59
        self._fixed_col_count = value
60

    
61
    @property
62
    def selected_item(self):
63
        return self._selected_item
64

    
65
    @selected_item.setter
66
    def selected_item(self, value):
67
        self._selected_item = value
68

    
69
    def selectionModel_selectionChanged(self, selected, deselected): # real signature unknown; restored from __doc__
70
        from EngineeringStreamlineItem import QEngineeringStreamlineItem
71
        from App import App
72
        if selected.indexes():
73
            selected = selected.indexes()[0]
74
            column_name_stream_no = self.model().headerData(selected.column(), self.horizontalHeader().orientation())  # 열 이름 가져오기
75
            mainWnd = App.mainWnd()
76
            viewer = mainWnd.graphicsView
77

    
78
            for item in [con for con in viewer.scene.items() if type(con) is QEngineeringStreamlineItem]:
79
                if item.stream_no_text == column_name_stream_no or item.stream_no == column_name_stream_no:
80
                    if self.selected_item == item:
81
                        break
82
                    rect = item.sceneBoundingRect()
83
                    margins = [rect.width(), rect.height()]
84
                    viewer.zoom_rect(rect.adjusted(-margins[0], -margins[1], margins[0], margins[1]))
85
                    item.setSelected(True)
86
                    item.update()
87
                    if self.selected_item:
88
                        self.selected_item.setSelected(False)
89
                        self.selected_item.update()
90
                    self.selected_item = item
91
                    break
92

    
93
    def setModel(self, model: QAbstractTableModel):
94
        QTableView.setModel(self, model)
95
        self.frozenTableView.setModel(model)
96
        self.frozenTableView.verticalHeader().hide()
97
        self.frozenTableView.setFocusPolicy(Qt.NoFocus)
98

    
99
        cols = model.columnCount()
100
        for col in range(cols):
101
            if col not in range(self._fixed_col_count):
102
                self.frozenTableView.setColumnHidden(col, True)
103
            else:
104
                self.frozenTableView.setColumnWidth(col, self.columnWidth(col))
105
        self.selection_model = self.selectionModel()
106
        self.selection_model.selectionChanged.connect(self.selectionModel_selectionChanged)
107

    
108
    def updateSectionWidth(self, logicalIndex, oldSize, newSize):
109
        if logicalIndex in range(self._fixed_col_count):
110
            self.frozenTableView.setColumnWidth(logicalIndex, newSize)
111
            self.updateFrozenTableGeometry()
112

    
113
    def updateSectionHeight(self, logicalIndex, oldSize, newSize):
114
        self.frozenTableView.setRowHeight(logicalIndex, newSize)
115

    
116
    def resizeEvent(self, event):
117
        QTableView.resizeEvent(self, event)
118
        self.updateFrozenTableGeometry()
119

    
120
    def scrollTo(self, index, hint):
121
        if index.column() >= self._fixed_col_count:
122
            QTableView.scrollTo(self, index, hint)
123

    
124
    def updateFrozenTableGeometry(self):
125
        frozen_width = sum([self.frozenTableView.columnWidth(col) for col in range(self._fixed_col_count)])
126
        if self.verticalHeader().isVisible():
127
            self.frozenTableView.setGeometry(self.verticalHeader().width() + self.frameWidth(),
128
                                             self.frameWidth(), frozen_width,
129
                                             self.viewport().height() + self.horizontalHeader().height())
130
        else:
131
            self.frozenTableView.setGeometry(self.frameWidth(),
132
                                             self.frameWidth(), frozen_width,
133
                                             self.viewport().height() + self.horizontalHeader().height())
134

    
135
    def moveCursor(self, cursorAction, modifiers):
136
        current = QTableView.moveCursor(self, cursorAction, modifiers)
137
        x = self.visualRect(current).topLeft().x()
138
        frozen_width = sum([self.frozenTableView.columnWidth(col) for col in range(self._fixed_col_count)])
139
        if cursorAction == self.MoveLeft:
140
            if current.column() >= self._fixed_col_count and x < frozen_width:
141
                new_value = self.horizontalScrollBar().value() + x - frozen_width
142
                self.horizontalScrollBar().setValue(new_value)
143
            elif current.column() < self._fixed_col_count:
144
                current = self.model().index(current.row(), current.column() + 1)
145
        elif cursorAction == self.MoveHome:
146
            new_value = self.horizontalScrollBar().value() + x - frozen_width
147
            self.horizontalScrollBar().setValue(new_value)
148
            current = self.model().index(current.row(), self._fixed_col_count)
149

    
150
        return current
151

    
클립보드 이미지 추가 (최대 크기: 500 MB)