2014-04-16 22 views
5

Desidero evidenziare la riga sul passaggio del mouse nel mio QTableWidget.Come evidenziare l'intera riga al passaggio del mouse in QTableWidget: Qt5

Quando si passa il mouse, è evidenziata solo una cella.

Ho provato questo approccio:

bool MyTabWidget::eventFilter(QObject *target, QEvent *event) 
{ 
    if(target == ui->MyTableWidget) 
    { 
     //Just to print the event type 
     qDebug() <<"EventType : "<<event->type(); 
    } 
} 

uscita: EventType : 13.

`(13 = QEvent::Move)` 

Ho perso di google. ma non ottenere alcuna soluzione adeguata.

C'è qualche altro approccio per soddisfare il mio requirment (per evidenziare l'intera riga al passaggio del mouse)?

Per favore aiuto. Grazie in anticipo.

EDIT:

prega di fare riferimento al di sotto schermata per più chiaro.

enter image description here

Questo è il mio QTableWidget voglio cambiare il colore di quella riga rossa confine (a cura) di sfondo su passaggio del mouse.

risposta

-3

non ho giocato con QT5 ancora, ma con QT4 questo è super-facile utilizzando un foglio di stile:

QTableView::item:hover { 
    background-color: rgba(200,200,220,255); 
}   
+1

Grazie #Leonardo Bernardini per la risposta, ma non funzionerà. Applicando StyleSheet, viene evidenziata solo una singola cella invece dell'intera riga ... –

+0

Quindi il tuo problema è relativo al comportamento di selezione, usa tableView-> setSelectionBehavior (QAbstractItemView :: SelectRows); –

+0

Voglio evidenziare la riga sul passaggio del mouse nel mio 'QTableWidget'. La soluzione di cui sopra non è applicabile per questo ... –

-2

Sto aggiungendo un'altra risposta perché è troppo lungo:

Ok' giusto, questo sta accadendo su QTableView. Ora la domanda è: perché hai bisogno di un QTableView? Se hai solo bisogno di un curriculum come quello che hai postato lì, puoi usare QTreeView, che invece di QTableView, supporta il passaggio del mouse sull'intera riga, invece di una singola cella .. Se hai assolutamente bisogno di un QTableView, devi disabilitare il tuo attuale effetto hover e sovrascrivi il metodo paint e mousemove. Sul tuo metodo mousemove calcola la riga sotto il mouse usando QTableView :: rowAt (y) (ricorda anche di mappare le coordie del mouse alle parent relative Widget) e memorizza un indice, se cambia da quello precedente, invalida l'intera tabella . Sull'evento paint, basta dipingere un rect attorno alla riga manualmente dopo aver chiamato l'evento paint della classe base ...

+0

Forse la prossima volta basterà suddividerlo in due commenti – neuronet

1

Ecco la mia implementazione, funziona bene.Prima dovresti creare sottoclasse QTableView/QTabWidget, emettere un segnale a QStyledItemDelegate in Funzione mouseMoveEvent/dragMoveEvent. Questo segnale invierà l'indice hovering.

In QStyledItemDelegate, utilizzare una variabile membro hover_row_ (modificata in un collegamento di slot con il segnale sopra) per indicare alla funzione di disegno quale riga deve essere spostata.

ecco il codice examaple:

//1: Tableview : 
void TableView::mouseMoveEvent(QMouseEvent *event) 
{ 
    QModelIndex index = indexAt(event->pos()); 
    emit hoverIndexChanged(index); 
    ... 
} 
//2.connect signal and slot 
    connect(this,SIGNAL(hoverIndexChanged(const QModelIndex&)),delegate_,SLOT(onHoverIndexChanged(const QModelIndex&))); 

//3.onHoverIndexChanged 
void TableViewDelegate::onHoverIndexChanged(const QModelIndex& index) 
{ 
    hoverrow_ = index.row(); 
} 

//4.in Delegate paint(): 
void TableViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
... 
    if(index.row() == hoverrow_) 
    { 
     //HERE IS HOVER COLOR 
     painter->fillRect(option.rect, kHoverItemBackgroundcColor); 
    } 
    else 
    { 
     painter->fillRect(option.rect, kItemBackgroundColor); 
    } 
... 
}