2011-06-29 85 views
6

我试图在QTableView中实现类似Excel的行为,其中在整个当前选区周围绘制边框。我尝试过这种方式,感觉像是有一百种不同的方式,并不断遇到问题。我可以很容易地绘制边框,但只要选择发生变化就会留下边框的残留物。下面是一个例子,我在QTableView中尝试:: ...的paintEventQt QTableView在活动单元格周围绘制边框


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); 
} 

该代码产生的结果,如this

我很想就如何使这个运行更加平稳的任何建议。我曾经在委托中尝试过这样做,但是委托需要知道所选的所有索引,并且它不能绘制QTableView绘制的网格线。另外,我的表类需要知道边框的绘制位置。

回答

4

尝试调用update();在你的selectionChanged函数中。这会减慢你的实现,但会删除垃圾。

+0

谢谢!现在工作好多了。尽管如此,你仍然可以看到一些点点滴滴(http://i.imgur.com/9Zoyw.png)。如果你知道是什么让我知道,否则你已经帮了很多。 – buck

+2

附录:我修正了它 - 如果你调用viewport() - > update();相反它修复了所有的问题。谢谢! – buck

相关问题