0

複数選択に関するトピックが少なくとも1回は発生することは知っていますが、正直なところ、もう見つけることができず、適切な解決策があったことを覚えています。

私が議論することを提案する2つの質問があります:

1) MS Excel セルの選択に似た動作を作成します。したがって、ユーザーは QTableView で 1 つのセルをクリックすると、クリックされたセルが強調表示され、さらにいくつかの「依存」セルの外観が変わります (選択されるか、何らかの方法で強調表示されます)。Excel では、セル数式の依存関係を示すために広く使用されています。

私はそれを解決するためのいくつかのアプローチがあることを知っています。最も簡単な方法は、適切なシグナル ハンドラー (QAbastractModelView clicked() など) のいずれかで依存セルを使用してビューの選択を変更することです。その方法は仕事をしますが、選択したセルの再描画後に配信される信号が発生するため、ちらつきを生成する最初のセルの後に依存選択が描画されるという醜い副作用があります。

2番目のアプローチはデリゲートの方法です。選択したセルに対してのみpaintEventを取得するため、いくつかの問題もあります。そのため、「依存」セルについてできることはあまりありません。実際には、クリックをキャッチし、選択を変更し、完全な選択が形成されるとすぐにすべてを描画する完全にカスタムのデリゲートを使用することで、この方法で解決できたので、実際には最初の再描画をスキップしましたが、完全には満足できませんでした視覚的には完全に正しいように見えましたが、結果は..主にTableViewの全体的な応答時間が大幅に短縮されたためです。その理由は、ユーザー クラスにシグナルを送信する前に、マウス クリックを受信した直後に Qt がネイティブ選択を描画し、このアプローチの場合、デリゲートの paintEvent がいくつかのメイン ループの後に到着するためです。そのため、' を使用した場合、顕著な遅延が発生します。

このような選択スキーマのサポートを追加するために QTableView のほとんどを完全に上書きすることが最善の選択肢であるとすでに考え始めていますが、もっと直接的なアプローチがあるのでしょうか?

2)2番目の質問(共通の問題があるため、まとめました)。月ごとの財務情報を表すグリッドがあり、1 か月以内に複数の列の情報があるとします。したがって、N 列のブロックが M 回繰り返されます。このようなグリッドを読みやすくする明白な方法は、各月の最初のデータ列のグリッドの垂直線に異なるスタイルを使用することです。それらを1〜2ピクセル広くするとしましょう。

セルごとにグリッド スタイルを指定することはできないため、setGrid(false) を設定し、デリゲートのセル コンテンツとして独自のグリッド線を描画しました。

しかし、ポイント1からの問題に直面しました。次に、Qtに特定のセルでデリゲートを使用するように指示します。デリゲートがpaintEventを取得する前に、Qtはセルの背景をクリアします。また、非表示のグリッドの場合、Qt がクリアする背景四角形は、必要なピクセルよりも 1 ピクセル大きくなります。グリッドの可視性を尊重しないため、おそらく Qt のバグと見なすことができますが、これにより隣接セルのグリッド線が削除されるため、セル自体のグリッドだけでなく、適切なセルの四角形を再計算してデリゲートを描画する必要があります。 Qt は (QPainter rect を分析することにより) ミスを犯し、隣接セルから削除されたものを復元して再描画する必要があるかどうかを判断します。これは非常に複雑なデリゲート ロジックにつながり、適切な解決策とは考えられません。

QTableView でセルごとにグリッドのスタイルを設定する適切な方法を知っているので、質問 2 を言い換えることができますか?

4

2 に答える 2