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