2011-06-29 20 views
6

Estoy tratando de implementar un comportamiento similar a Excel en un QTableView, donde un borde se pinta alrededor de la selección actual completa. Lo intenté con cientos de maneras diferentes y sigo teniendo problemas. Puedo dibujar el borde con bastante facilidad, pero quedan restos del borde cada vez que cambia la selección. He aquí un ejemplo que he probado en QTableView :: paintEvent ...Qt QTableView dibuja un borde alrededor de las celdas activas


void MyTableView::paintEvent(QPaintEvent* event) 
{ 
    // call QTableView's paint event first so we can draw over it 
    QTableView::paintEvent(event); 

    // activeSelection is a list of indexes that is updated in another function 
    // the function also calls QTableView::repaint whenever this list changes 
    // in an attempt to erase the previously drawn border 
    if(!activeSelection.size()) 
     return; 

    QRect rect = visualRect(activeSelection.at(0)) | 
      visualRect(activeSelection.at(activeSelection.size() - 1)); 
    // temporarily draw smaller border so it doesn't lie on the grid lines 
    rect.adjust(4, 4, -4, -4); 
    QPen pen(Qt::black, 2); 
    QPainter painter(viewport()); 
    painter.setPen(pen); 
    painter.drawRect(rect); 
} 

Ese código produce resultados como this

me encantaría alguna sugerencia sobre cómo hacer que esto funcione mejor. Intenté hacer esto en el delegado, pero luego el delegado necesita saber todos los índices que se seleccionan y no puede pintar sobre las líneas de cuadrícula dibujadas por QTableView. Además, mi clase de tabla necesita saber dónde se ha dibujado el borde.

Respuesta

4

intente llamar a update(); en su selecciónCambio de función. esto ralentizará su implementación, pero eliminará la basura.

+0

gracias! Está funcionando mucho mejor ahora. Sin embargo, todavía quedan algunos bits, como ve [aquí] (http://i.imgur.com/9Zoyw.png). Si sabes de qué se trata, házmelo saber, de lo contrario ya has ayudado mucho. – buck

+2

adenda: Lo arreglé, si llamas a viewport() -> update(); en cambio, soluciona todos los problemas. ¡Gracias! – buck

Cuestiones relacionadas