A little more info after starting a 2nd debug session.
I set a breakpoint so that I could walk through the first call to QAbstractItemView::event -> QAbstractScrollArea::event -> QPainter::QPainter -> QPainter::begin
The first call to redirected has the redirectedDev pointer in the QPaintDevice pointing to a valid QPaintDevice with a QImage, 7 slots in the __vfptr that look valid, and both the painters and reserved member variables set to 0 (zero):
redirectDev 0x0d3ea70c {d=0x0d3ea760 } QPaintDevice * [QImage] {d=0x0d3ea760 } QImage __vfptr 0x0551c988 const QImage::`vftable' * [0x0] 0x050113fa QImage::`vector deleting destructor'(unsigned int) * [0x1] 0x04ff8ae9 QImage::devType(void) * [0x2] 0x04ffe27d QImage::paintEngine(void) * [0x3] 0x0500b077 QImage::metric(enum QPaintDevice::PaintDeviceMetric) * [0x4] 0x05001757 QPaintDevice::initPainter(class QPainter *) * [0x5] 0x04ff570e QPaintDevice::redirected(class QPoint *) * [0x6] 0x04ff9246 QPaintDevice::sharedPainter(void) * painters 0x0000 unsigned short reserved 0x00000000 QPaintDevicePrivate *The redirectDev is a QTableView member variable that's already been populated. I will run through a few cycles to see if this value is changing.