2011-06-29 82 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

相關問題