2016-12-22 14 views
4

enter image description herePyQt4에서 QTableView의 세로 머리글 크기를 조정 하시겠습니까?

나는 첫 번째 열 (수직 헤더 열)의 크기를 줄일 필요가

내가 PyQt4에 QTableView의 수직 헤더의 크기를 조정할 수있는 방법

?

이 테이블을 표시하기 위해 매우 큰 헤더와 작은 GUI 블록이 있습니다. 제발 도와주세요!

모든 열의 크기를 조정할 수 있지만 세로 머리글의 크기를 조정할 수없는 이유는 무엇입니까? 나는 사용자으로 크기를 조정할 수 있습니다 헤더를 만들 하려는

self.tableView.setColumnWidth(0, 30) // only able to change the data columns in table not headers 

self.tableView.verticalHeader().setResizeMode(QHeaderView.Interactive) //Able to change the height of headers but not width of them 

및 창 크기, 크기와 같은 프로젝트의 다른 매개 변수에 대한 종속성이 없습니다 :

내가 좋아하는 많은 것들을 시도 다른 열 ....

누군가가 도와 줄 수 있습니까?

+0

Qt 디자이너를 사용해 보셨습니까? – Ronikos

+0

죄송합니다.이 책을 처음 접하십니까? Qt Designer는 어떻게 사용합니까? – learncode

+0

Qt Designer를 사용하면 드래그 앤 드롭 요소를 사용하여 UI를 만들 수 있습니다. 수동으로 UI를 코딩하는 것보다 사용하기가 훨씬 쉽고 코드가 정리됩니다. 이 프로젝트가 큰 경우 Qt 디자이너로 전환하는 것이 좋습니다. 일부 작업은 명시 적으로 코딩해야하지만 아이러니하게도 그 중 하나입니다 – Ronikos

답변

3

setMaximWidth을 사용하여 세로 머리글의 크기를 모으고 setTextElideMode을 사용하여 텍스트가 잘리는 방식을 조정하십시오.

그러나 사용자가 크기를 조정할 수있는 세로 헤더 너비를 만드는 기본 제공 방법은 없습니다. 해결 방법으로 크기 조정 이벤트를 사용하여 세로 너비의 너비를 전체 너비의 백분율로 조정할 수 있습니다. 그런 식으로 창 크기를 조정하면 세로 머리글의 너비가 변경됩니다.

import sys 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
     super(Window, self).__init__() 
     self.table = QtGui.QTableView(self) 
     self.table.installEventFilter(self) 
     self.table.verticalHeader().setTextElideMode(QtCore.Qt.ElideRight) 
     model = QtGui.QStandardItemModel(rows, columns, self.table) 
     for row in range(rows): 
      item = QtGui.QStandardItem('FOO_BAR_123_AB_CD_%s' % row) 
      model.setVerticalHeaderItem(row, item) 
      for column in range(columns): 
       item = QtGui.QStandardItem('(%d, %d)' % (row, column)) 
       item.setTextAlignment(QtCore.Qt.AlignCenter) 
       model.setItem(row, column, item) 
     self.table.setModel(model) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.table) 

    def eventFilter(self, source, event): 
     if event.type() == QtCore.QEvent.Resize and source is self.table: 
      source.verticalHeader().setMaximumWidth(source.width()/4) 
     return super(Window, self).eventFilter(source, event) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window(15, 5) 
    window.setGeometry(600, 100, 400, 300) 
    window.show() 
    sys.exit(app.exec_()) 

UPDATE :

내가 수직 헤더 폭의 사용자 크기 조정을 구현하는 사용자 정의 헤더 클래스를 작성에서 이동을 한 다음

는 모두를 구현하는 데모 스크립트입니다. 그것은 거의 작동하지만 마우스로 드래그하는 동안 뷰를 올바르게 업데이트하는 방법을 찾을 수 없습니다. 어쨌든, 여기 그것이 작동하는 방법을 볼 수 있습니다 나는 경우 사람이 지금까지 가지고있는 데모입니다

import sys 
from PyQt4 import QtCore, QtGui 

class HeaderView(QtGui.QHeaderView): 
    def __init__(self, table): 
     super(HeaderView, self).__init__(QtCore.Qt.Horizontal, table) 
     self.setClickable(True) 
     self.setHighlightSections(True) 
     self.setResizeMode(QtGui.QHeaderView.Interactive) 
     self._vheader = table.verticalHeader() 
     self._resizing = False 
     self._start_position = -1 
     self._start_width = -1 

    def mouseMoveEvent(self, event): 
     if self._resizing: 
      width = event.x() - self._start_position + self._start_width 
      if width > 0: 
       self._vheader.setFixedWidth(width) 
       # TODO: find a proper replacement for this 
       self.geometriesChanged.emit() 
     else: 
      super(HeaderView, self).mouseMoveEvent(event) 
      if 0 <= event.x() <= 3: 
       if not self.testAttribute(QtCore.Qt.WA_SetCursor): 
        self.setCursor(QtCore.Qt.SplitHCursor) 

    def mousePressEvent(self, event): 
     if not self._resizing and event.button() == QtCore.Qt.LeftButton: 
      if 0 <= event.x() <= 3: 
       self._start_position = event.x() 
       self._start_width = self._vheader.width() 
       self._resizing = True 
       return 
     super(HeaderView, self).mousePressEvent(event) 

    def mouseReleaseEvent(self, event): 
     self._resizing = False 
     super(HeaderView, self).mouseReleaseEvent(event) 

class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
     super(Window, self).__init__() 
     self.table = QtGui.QTableView(self) 
     self.table.setHorizontalHeader(HeaderView(self.table)) 
     self.table.verticalHeader().setTextElideMode(QtCore.Qt.ElideRight) 
     model = QtGui.QStandardItemModel(rows, columns, self.table) 
     for row in range(rows): 
      item = QtGui.QStandardItem('FOO_BAR_123_AB_CD_%s' % row) 
      item.setToolTip(item.text()) 
      model.setVerticalHeaderItem(row, item) 
      for column in range(columns): 
       item = QtGui.QStandardItem('(%d, %d)' % (row, column)) 
       item.setTextAlignment(QtCore.Qt.AlignCenter) 
       model.setItem(row, column, item) 
     self.table.setModel(model) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.table) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window(15, 5) 
    window.setGeometry(600, 100, 400, 300) 
    window.show() 
    sys.exit(app.exec_()) 
+0

답변을 주셔서 감사합니다! 나는 고정 maxWidth 데에 대해이 대안을 생각해 봤지만 정확히 내가 무엇을 찾고 있었는지 않습니다. 따라서 사용자가 자신의 의지로이 머리글의 크기를 조정할 수있는 방법이 없다고 말하고 있습니다. – learncode

+0

일부 헤더에는 문자가 하나 뿐이고 일부 파일에는 약 1000 자 정도의 문자가 있기 때문에 큰 문제입니다. maxWidth와 함께 크기를 고정하고 싶지 않으므로 – learncode

+1

@VenkataNarsiReddyVaddula. 최대 폭은 고정되어 있지 않습니다. 창 크기를 조정하면 크기 조정 이벤트에서 조정됩니다. 나는 테이블 너비의 백분율을 사용했지만, 원하는대로 설정할 수 있습니다. – ekhumoro

0

PyQt는 약간의 문서화 경향이 있지만, this page은 QTableView 클래스에 대한 모든 가능한 정보를 제공합니다.

내가 특정 문제가 무엇인지 확실하지 오전하지만 당신이 시도 할 수 :

self.tableView.horizontalHeader().setSectionResizeMode(3) 

The documentation of .setSectionResize()

을 다른 방법으로, 한 세트의 크기에 각 헤더의 크기를 조정하려면, 시도 :

self.tableView.horizontalHeader().resizeSection(0, pixelSize1) 
self.tableView.horizontalHeader().resizeSection(1, pixelSize2) 
self.tableView.horizontalHeader().resizeSection(2, pixelSize3) 
... 

The documentation of .resizeSection()

+0

문제를 더 잘 이해하는 데 도움이되는 이미지를 업로드했습니다. 또한 QHeaderView에는 setSectionResizeMode()가 없습니다. setResizeMode()를 시도했습니다. – learncode

1

Ekhumoro의 솔루션은 거의 완벽하게 작동합니다. 크기 조정 중에 나타나는 고르지 않은 끌기 동작은 크기 조정이 진행되는 동안 좌표 공간이 변경되는 것과 관련이 있습니다.

이 고르지 못한 동작을 수정하고 부드러운 크기 조정을하려면 headerView의 로컬 좌표가 아닌 전역 좌표 공간을 사용해야합니다. 이 단순히 대체 event.globalX와 event.x()

 #width = event.x() - self._start_position + self._start_width 
     width = event.globalX() - self._start_position + self._start_width 

      #self._start_position = event.x() 
      self._start_position = event.globalX() 

I 또한 geometried 변경된 신호를 변경 수직 헤더 emited 할 아닌 수평 헤더를 수행한다. 실제로 크기를 변경 한 것은 수직 헤더 였기 때문입니다. 그러나 나의 테스트 케이스에서 나는 그것이 중요하게 중요하다는 것을 말할 수 없었다. 그러나 개념적으로 그것은 옳은 것처럼 보인다.

  #self.geometriesChanged.emit() 
      self._vheader.geometriesChanged.emit()