구리의 창고

QT Programming - QTreeView 의 checkbox 클릭 여부 확인하기 본문

QT

QT Programming - QTreeView 의 checkbox 클릭 여부 확인하기

구리z 2011. 9. 5. 15:24
QTreeView를 사용 할 때 checkbox를 사용하다보면 문제가 생긴다.

아이템과 마우스를 처리하면서 clicked 시그날을 사용 할 때가 있는데,

문제는 item을 클릭할 때와 checkbox를 클릭 할 때 체크되게 하는 경우이다. 

checkbox도 item으로 인식하기 때문에 check와 click이 같이 발생하게 되는것이다.


그래서 시그날이 발생하는 순서를 살펴봤다. 

* clicked 의 경우
mousePressEvent() -> mouseReleaseEvent()
=> clicked 발생

* checked 의 경우 (시그날은 아니지만)
mouseReleaseEvent()
=> checked 발생

위와 같이 mouseReleaseEvent() 시에 checked와 clicked 가 같이 발생하게 되는 것이다.

이러면 checked로 체크 후에 다시 clicked에서 체크 해제하는 바람에 아무 것도 일어나지 않는 것처럼 보이게 된다.
(순서는 바꼈을지도 모른다)

그러므로 mouseReleaseEvent() 를 오버로딩해서 체크박스 클릭여부를 확인 후 ignore 시키고 clicked만 발생시켜준다.

 
void OrganizationTreeView::mouseReleaseEvent(QMouseEvent* event)
{
	//whether checkbox is clicked.
	QModelIndex index = indexAt(event->pos());
	if(index.isValid())
	{
		QRect vrect = visualRect(index);
		int itemIndentation = vrect.x() - visualRect(rootIndex()).x();
	
		QRect rect = QRect(header()->sectionViewportPosition(0) + itemIndentation 
			, vrect.y(), style()->pixelMetric(QStyle::PM_IndicatorWidth), vrect.height());

		if(rect.contains(event->pos()))
		{
			//prevent from emitting checked and clicked and then emit only clicked.
			emit clicked(index);
			event->ignore();
		}
		else
		{
			QTreeView::mouseReleaseEvent(event);
		}
	}
}

Comments