QTableView의 ItemDelegate에서 해당 Row가 mouse hover 상태인지 직접 알수가 없다.


그래서 다음의 단계가 필요하다.


1. QTableView를 상속 받은 클래스를 만들고 해당 클래스는 다음과 같이 mousemove, mouse leaver에 대한 event를 처리하게 한다.

CustomTableView::CustomTableView(QWidget *parent) : QTableView(parent)

{

setMouseTracking(true);

}

void CustomTableView::mouseMoveEvent(QMouseEvent *event)

{

QModelIndex index = indexAt(event->pos());

emit hoverIndexChanged(index);

}

void CustomTableView::leaveEvent(QEvent *event)

{

emit leaveTableEvent();

viewport()->update();

}


2. 이 때 발생한 signal을 처리할 수 있도록 이 CustomTableView를 사용하는 곳에서 signal / slot을 설정한다.

connect(customTable_,

&ui::CustomTableView::hoverIndexChanged,

itemDelegate,

&ui::LoginInfoTableDelegate::slotHoverIndexChanged);

connect(loginInfoTable_,

&ui::CustomTableView::leaveTableEvent,

itemDelegate,

&ui::LoginInfoTableDelegate::slotLeaveTableEvent);


3. 사용할 ItemDelegate에서 다음과 같이 처리한다.

void CustomTableDelegate::slotHoverIndexChanged(const QModelIndex& item)

{

hoverRow_ = item.row();

}


void CustomTableDelegate::slotLeaveTableEvent()

{

hoverRow_ = -1;

}


4. 3번 slot으로 인해서 ItemDelegate의 Paint에서는 hoverRow_를 알 수 있게 된다.

void CustomTableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

{

int column = index.column();

QStyleOptionViewItem itemOption(option);

bool isHovered = false;

if (index.row() == hoverRow_)

{

itemOption.state = itemOption.state | QStyle::State_MouseOver;

isHovered = true;

}

else

{

itemOption.state = itemOption.state &  (~QStyle::State_MouseOver);

}


이제 마음껏 hover 되었을 때의 효과를 반영하면 된다~



by 무위자연 2019. 3. 13. 13:48