Logo Search packages:      
Sourcecode: qps version File versions

void QtTableView::paintEvent ( QPaintEvent *  e  )  [protected]

Handles paint events, e, for the table view.

Calls paintCell() for the cells that needs to be repainted.

Definition at line 1271 of file qttableview.C.

References cellHeight(), cellWidth(), colXPos(), findCol(), findRow(), maxViewX(), maxViewY(), paintCell(), rowYPos(), setupPainter(), testTableFlags(), updateScrollBars(), and viewRect().

Referenced by repaint().

{
    QRect updateR = e->rect();                  // update rectangle
    if ( sbDirty ) {
      bool e = eraseInPaint;
      updateScrollBars();
      eraseInPaint = e;
    }

    QPainter paint( this );

    if ( !contentsRect().contains( updateR, TRUE  ) ) {// update frame ?
      drawFrame( &paint );
      if ( updateR.left() < frameWidth() )            //###
          updateR.setLeft( frameWidth() );
      if ( updateR.top() < frameWidth() )
          updateR.setTop( frameWidth() );
    }

    int maxWX = maxViewX();
    int maxWY = maxViewY();
    if ( updateR.right() > maxWX )
      updateR.setRight( maxWX );
    if ( updateR.bottom() > maxWY )
      updateR.setBottom( maxWY );

    setupPainter( &paint );               // prepare for painting table

    int firstRow = findRow( updateR.y() );
    int firstCol = findCol( updateR.x() );
    int      xStart, yStart;
    if ( !colXPos( firstCol, &xStart ) || !rowYPos( firstRow, &yStart ) ) {
      paint.eraseRect( updateR ); // erase area outside cells but in view
      return;
    }
    int       maxX      = updateR.right();
    int       maxY      = updateR.bottom();
    int       row = firstRow;
    int       col;
    int       yPos      = yStart;
    int       xPos = maxX+1; // in case the while() is empty
    int       nextX;
    int       nextY;
    QRect winR = viewRect();
    QRect cellR;
    QRect cellUR;
#ifndef QT_NO_TRANSFORMATIONS
    QWMatrix matrix;
#endif

    while ( yPos <= maxY && row < nRows ) {
      nextY = yPos + (cellH ? cellH : cellHeight( row ));
      if ( testTableFlags( Tbl_cutCellsV ) && nextY > ( maxWY + 1 ) )
          break;
      col  = firstCol;
      xPos = xStart;
      while ( xPos <= maxX && col < nCols ) {
          nextX = xPos + (cellW ? cellW : cellWidth( col ));
          if ( testTableFlags( Tbl_cutCellsH ) && nextX > ( maxWX + 1 ) )
            break;

          cellR.setRect( xPos, yPos, cellW ? cellW : cellWidth(col),
                               cellH ? cellH : cellHeight(row) );
          cellUR = cellR.intersect( updateR );
          if ( cellUR.isValid() ) {
            cellUpdateR = cellUR;
            cellUpdateR.moveBy( -xPos, -yPos ); // cell coordinates
            if ( eraseInPaint )
                paint.eraseRect( cellUR );

#ifndef QT_NO_TRANSFORMATIONS
            matrix.translate( xPos, yPos );
            paint.setWorldMatrix( matrix );
            if ( testTableFlags(Tbl_clipCellPainting) ||
                 frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt
                paint.setClipRect( cellUR );
                paintCell( &paint, row, col );
                paint.setClipping( FALSE );
            } else {
                paintCell( &paint, row, col );
            }
            matrix.reset();
            paint.setWorldMatrix( matrix );
#else
            paint.translate( xPos, yPos );
            if ( testTableFlags(Tbl_clipCellPainting) ||
                 frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt
                paint.setClipRect( cellUR );
                paintCell( &paint, row, col );
                paint.setClipping( FALSE );
            } else {
                paintCell( &paint, row, col );
            }
            paint.translate( -xPos, -yPos );
#endif
          }
          col++;
          xPos = nextX;
      }
      row++;
      yPos = nextY;
    }

    // while painting we have to erase any areas in the view that
    // are not covered by cells but are covered by the paint event
    // rectangle these must be erased. We know that xPos is the last
    // x pixel updated + 1 and that yPos is the last y pixel updated + 1.

    // Note that this needs to be done regardless whether we do
    // eraseInPaint or not. Reason: a subclass may implement
    // flicker-freeness and encourage the use of repaint(FALSE).
    // The subclass, however, cannot draw all pixels, just those
    // inside the cells. So QtTableView is reponsible for all pixels
    // outside the cells.

    QRect viewR = viewRect();
    const QColorGroup g = colorGroup();

    if ( xPos <= maxX ) {
      QRect r = viewR;
      r.setLeft( xPos );
      r.setBottom( yPos<maxY?yPos:maxY );
      if ( inherits( "QMultiLineEdit" ) )
          paint.fillRect( r.intersect( updateR ), g.base() );
      else
          paint.eraseRect( r.intersect( updateR ) );
    }
    if ( yPos <= maxY ) {
      QRect r = viewR;
      r.setTop( yPos );
      if ( inherits( "QMultiLineEdit" ) )
          paint.fillRect( r.intersect( updateR ), g.base() );
      else
          paint.eraseRect( r.intersect( updateR ) );
    }
}


Generated by  Doxygen 1.6.0   Back to index