2014-07-08 8 views
1

사용자 지정 대리자가있는 QTreeView를 사용 중이고 QAbstractItemModel을 서브 클래 싱했습니다. 자녀가없는 항목에 눈금 선을 표시하고 싶습니다.QTreeView로 눈금 선 표시

처음에는 모든 것이 잘 보이지만 항목 위로 마우스를 가져 가면 항목 위로 마우스를 가져 가면 아래쪽 또는 위쪽 줄이 사라지고 다시 나타납니다.

내 첫 번째 게시물이기 때문에, 나는 원치 않는 효과를 보여주기 위해 일부 이미지를 게시 할 수없는 것으로 보입니다.

하지만 난 내 사용자 지정 위임 또는 QTreeView 내 스타일로 뭔가 잘못된 것 같아요 :

void ProjetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    if (index.column() > 0 && !index.model()->hasChildren(index)) 
    {   
     QPen pen; 
     pen.setColor(QColor(Qt::lightGray)); 
     pen.setWidth(1); 
     painter->setPen(pen); 
     painter->drawRect(option.rect); 
     QStyledItemDelegate::paint(painter,option,index); 
    } 
    else QStyledItemDelegate::paint(painter,option,index); 
} 

사용되는 스타일 시트는 다음과 같습니다

QString treeViewStyle = 
    "QTreeView { show-decoration-selected: 1; }" 
    "QTreeView::item:hover { background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 lightgray, stop: 1 white); }" 
    "QTreeView::item:selected:active { background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 lightgray, stop: 1 lightgray); color: black; }" 
    "QTreeView::item:selected:!active { background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 lightgray, stop: 1 lightgray); color: black;}" ; 

이 제거하는 방법에 대한 아이디어를 사람을 가지고 동적 행동과 첫 번째 디스플레이에서 초기 올바른보기를 유지?

감사합니다.

답변

0

문제가있는 경우 국경을 사용하십시오. 말하기가 어렵습니다.

빨간색과 다른 밝은 색상을 사용하고 테두리 또는 bg를 사용하여 항목을 표시하면 어떤 색상이 표시되는지 확인할 수 있습니다. 어떤 항목이 문제를 일으키는 지 알아내는 데 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다. QStyledItemDelegate의 기본 클래스에서 스타일 시트와 페인트 메서드를 사용하는 대체 솔루션을 찾았지만 정확히 처음에는 원하는 바가 아닙니다. "QTreeView :: item :! has-children {border : 0.5px; border-style : 솔리드; border-color : lightgray;} " ' – IbliSS

+0

나는 여전히 해결 방법이나 해킹과 같이 고려할 것입니다. 어쨌든 ... 멋진 – Yash

0

이 게시물은 꽤 오래 알고 있지만 여전히 내가 기여할 수 있다고 생각 : (!)

것은 당신이 당신의 사각형을 그린 후

QStyledItemDelegate::paint(painter,option,index); 

를 사용하는 것이, 그래서이 할 수있는 (그리고 나는 실제로) 당신의 사각형을 overpainting 같아요. 내가이 좋을 것 항목 대리자를 사용

0

하는 데 도움이되는 그리드를

희망 페인트 싶었던 은 내가 QTreeView과 같은 문제가 있었지만, 때문에 많은 항목을 표시 할 때 낮은 성능이 발생할 수 있습니다의 모든 항목은 paint 메소드를 순환해야합니다. 또한 각 열마다 다른 대리자를 사용하는 경우 (일부는 자체 페인트 메서드가 있음) 문제가 될 수 있습니다.

QTreeView.drawRow()을 구현하는 또 다른 방법은 비 검정색 (또는 알파 구성 요소) 색상으로 일관성없는 그리기를 초래할 수있는 실제 직사각형을 그리지 않는 이점이 있습니다. PyQt를 사용하고 있지만 다른 언어에서도 읽을 수 있어야합니다.

def drawRow(self, painter, option, index): 
    QtGui.QTreeView.drawRow(self, painter, option, index) 
    painter.setPen(QtCore.Qt.lightGray) 
    y = option.rect.y() 
    #saving is mandatory to keep alignment through out the row painting 
    painter.save() 
    painter.translate(self.visualRect(self.model().index(0, 0)).x() - self.indentation() - .5, -.5) 
    for sectionId in range(self.header().count() - 1): 
     painter.translate(self.header().sectionSize(sectionId), 0) 
     painter.drawLine(0, y, 0, y + option.rect.height()) 
    painter.restore() 
    #don't draw the line before the root index 
    if index == self.model().index(0, 0): 
     return 
    painter.drawLine(0, y, option.rect.width(), y) 

코드는 상기 헤더 부분의 크기 및 트리 덴트를 추적, 전에 모든 행과 모든 열에 전에 수직 한 수평선 무; rootIsDecorated 속성을 사용하여 작동 방식을 확인하지 않았습니다.