2011-06-29 18 views
6

Geçerli seçimin etrafına bir kenarlık çizildiğinde QTableView'da benzer Excel davranışını uygulamaya çalışıyorum. Bunu yüzlerce farklı şekilde hissettim ve problem almaya devam ettim. Sınırı yeterince kolay çizebilirim, ancak seçimin değiştiği her zaman sınırın kalıntıları kalır. İşte Qt QTableView, etkin hücreler etrafında kenarlık çizme


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

Bu kod

Ben daha sorunsuz bu çalışmasını sağlamak için nasıl herhangi bir öneri isterdim böyle this

olarak sonuçlar üretir ... Ben QTableView denedim bir örnek :: paintEvent olduğunu. Bunu delege içinde yapmayı denedim, ancak temsilci seçilen tüm dizinleri bilmeli ve QTableView tarafından çizilen ızgara çizgilerini boyayamaz. Ayrıca, masa sınıfımın sınırın çizildiği yeri bilmesi gerekiyor.

cevap

4

update(); Seçiminizdeki işlev. Bu, uygulamanızı yavaşlatacak, ancak çöpü kaldıracaktır.

+0

Teşekkürler! Şimdi çok daha iyi çalışıyor. Yine de biraz bit var, yine de gördüğünüz gibi (burada) (http://i.imgur.com/9Zoyw.png). Bunun neyle ilgili olduğunu biliyorsanız, lütfen bana çok yardımcı oldunuz. – buck

+2

addendum: Sabitledim - viewport'u çağırırsanız() -> update(); bunun yerine tüm sorunları giderir. Teşekkürler! – buck