1

インタラクティブボードゲームの実装でQTableViewを使用しています。表のセルに画像が表示されます。QStyledItemDelegateとpaint関数を使用して、テーブルセル内に画像を描画しています。

画像はテーブルの特定のセルにのみ表示され、ユーザーがテーブルセルをクリックすると更新される必要があるため、テーブルと同じサイズのdoubleint配列が使用されます。配列の値に応じて、画家はテーブルの特定のセルに画像を描画する必要があります。最初は、テーブルの4つのセル内に4つの画像しかありません。ユーザーがテーブル内のセルをクリックすると、配列が更​​新されます。これは、テーブルのセル内に描画および表示されるものを変更する必要があることを意味します。

通常、ユーザーは正常に更新された空の(白い)セルをクリックすると、特定の画像がセルに表示されます。ただし、画像を含み、更新する必要がある他のセルがある場合、double int配列は更新されますが、更新は表示されません。また、表示が更新されているはずのセルをクリックすると、更新が行われるという奇妙なこともわかりました。もちろん、このコースは、誰かがセルをクリックしたときに更新する方法に関係なく発生します。

再描画する前に、まずセル内の内容を消去しようとしましたが、それでも機能しません。デリゲートはスレッド内で継続的に実行され、ペインタ関数はテーブル内の各セルのインデックスを使用して呼び出されますか?画家がセルの領域を再描画する必要があり、セルをクリックした後にのみ発生するにもかかわらず、画像を含むセルの更新が自動的に更新されない方法がわかりません。または、そのcusは、毎回新しい画家が画家の機能に呼び出されますか?!

さて、これが代表者の画家の機能の私の実装です:

void Sphere::paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
 {
     if(tb1[index.row()][index.column()] == 1)
     {
         QImage Q1("Red Sphere.jpg");

     QRectF source(0.0, 0.0, 72.0, 70.0);

     painter->eraseRect(option.rect);

     if (option.state & QStyle::State_Selected)
             painter->fillRect(option.rect, option.palette.highlight());

     painter->drawImage(option.rect, Q1, source);

     }
     else if(tb1[index.row()][index.column()] == 2)
     {
         QImage Q1("Blue Sphere.jpg");

     QRectF source(0.0, 0.0, 72.0, 70.0);

     painter->eraseRect(option.rect);

     if (option.state & QStyle::State_Selected)
             painter->fillRect(option.rect, option.palette.highlight());


     painter->drawImage(option.rect, Q1, source);

     }
     else 
     {
         painter->eraseRect(option.rect);

         QStyledItemDelegate::paint(painter, option, index);
     }
  } 

私の問題を解決する必要がある場合は、さらに情報を提供できます。前もって感謝します。

4

2 に答える 2

1

QTドキュメントによると

描画後、この関数が呼び出されたときに提供された状態にペインタが戻ることを確認する必要があります。たとえば、ペイントの前に QPainter::save() を呼び出し、後で QPainter::restore() を呼び出すと便利な場合があります。

関数に QPainter のsave()およびrestore()メソッドが欠落していると思います。

于 2011-06-09T06:15:24.060 に答える
1

また、奇妙なことも見ました。つまり、表示が更新されるべきセルをクリックすると、更新が行われます。

現在のセルでユーザーが行った変更によって魔女セルが影響を受けると判断し、それらのセルをupdate(). 考えてみると、デリゲートは、tb1変更内容が属するセルを再描画することを自動的に決定するかどうかを確認できます。

編集

これを行う簡単な方法は、スロットをに接続してからclicked ( const QModelIndex & index )、ここで変更内容を決定し、メソッドを呼び出すことupdate ( const QModelIndex & index )です...

于 2011-06-08T16:12:23.253 に答える