2011-06-29 19 views
6

QTableViewに同様のExcelの動作を実装しようとしていますが、現在の選択範囲全体に境界線が描画されています。私はこれを100種類の方法のように感じ、問題を解決し続けました。私は境界線を十分に簡単に描くことができますが、境界線の残りの部分は、選択が変わるたびに残されます。ここで私はQTableViewで試してみた:: paintEvent ...Qt 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

関連する問題