オリジナルリンク:QRowTableフォームコントロール(5) -デフォルトのソートを復元するために、第三のクリックをサポートする、ソートするヘッダーを書き換えます
まず、天然型
クライアントプログラムの開発方法をヶ月以上のソース、今非常に人気libcef、電子などしかし、本来の生化学の発展と不可分まだ、クライアント・ソフトウェア・プログラムの急速な発展として使用していますが、ユーザーエクスペリエンスの数が必要な場合はすることができます遅いが、良いパフォーマンス。
オリジナルの生化学的開発といえば、比較的多くの人気対応UIライブラリがQtは、soui、duilibだけでなく、昔ながらのMFCおよびその他のサードパーティ企業ようにdirectUIオープンソースのライブラリを維持しします。インターネットは、仕上げの記事を見つけるために、興味のある学生は、を参照することができますC ++インタフェースライブラリ。
C ++クライアントは、現在最も広く使用されているGUIのコントロールだけでなく、QtのUIフレームワークは、より多くの使用Qtの学生はQtの動的ライブラリは、数十人がインストールされている、より明確であるソリューションの一種であるということですあなただけのQtのGUIモジュールを使用したい場合は、より、しかし、それは彼らだけではコアモジュールQtCore、GUIモジュールQtGuiとQtWidgetあり、3つの動的ライブラリをすることができ含まれています。
私たちはQtの当社の開発SDKとして、ほとんどの時間は、ネイティブコントロール+ QSS造園は、我々のニーズを完了しますが、そのようなプロダクトマネージャー、脳死時、またはビジネスシナリオの吸盤、総いつものようにいくつかの特別な例は、ある場合にはいくつかの奇妙な相互作用を完了する必要があり、我々はネイティブコントロールの実装を書き換える必要があります。
制御テーブルの列の並べ替え - 今日それはケースがあります。
特別なシーンの下で、私たちのテーブルにデータがQtは、私たちは良い与えているこのテーブルコントロールをソートする必要があるかもしれません示して、私たちはすることができクラスとインタフェースの一部を記述する必要があります。フロントグリッドコントロールの4つの特徴を書いて、それらはQRowTableグリッドコントロール-支持体は、列のソートを指定し、行全体を置く行全体をチェックし、赤、緑、秋バラ- QRowTableフォームコントロール(2)は、QRowTableフォームコントロール(C)を-効率の最適化- QStandardItemの使用の合理化とQRowTableフォームコントロール(4) -効率の最適化-データソースの最適化は、興味のある学生が行くと見ることができます。
残念ながらQtは、テーブルのソート機能が付属していますつまり、我々はすべてのインターフェイスは、まだ責任あるビジネスのニーズを満たすことができない完了するために急いで - テーブルヘッダ三つの連続3ポイントのサイクルで、それが何を意味するのでしょうか?
伝統的なテーブルのソート
Qtは、テーブルのソート振る舞いが付属して注文されていないデフォルトでは、我々はインターフェイスを介して、またはインタフェースの設定を注文しないことによってソートする回すことができる、という私たちは、ソートルールを有効にすると、私たちのフォームのクリック、クリックが下降していると仮定され、第2のダウン昇順さをクリックして、降順のルールに戻りますもう一度クリックすると、これはまだ非常に完璧ではありません!
言うべきこの時間は、製品は何か、あなたは三回目をクリックすると、あなたが並べ替えないようにプログラムを設定する必要があります。
プログラマ:FML。。。。あなたは何と言います。。。。聞こえません。。。。
新しい照合順序
テーブルの上に伝統的なソートに基づいていくつかの調整を行います
- あなたは、いくつかの並べ替え列が許可されていませんサポートすることができます
- 昇順 - - 降順で、すなわち、サイクルとして連続して3回をクリック障害サイクル3のこの状態を
私は脳がまだ製品に非常に大きな穴であることを言わなければなりません。製品以来、私たちは、この機能は、その後、まだ検討する時間を持っている必要があることを言いたいです。特別なニーズを持つユーザーのために、この機能は関数ではありませんが、私たちのソフトウェアが安定しているとき、この研究と機能を考慮することができない場合、反復はそれほど気にならないですが、長い時間の後、以下の構成で、製品と通信しますそれは。
その後、我々はまた、この記事を持っていました
ロジックはQt自体を書き換えながら、期待していなかったか、達成することができます!!!
第二に、結果は
最初のマップ上の慣例により、学生が欲しいかどうかを確認します。
第三に、実装
新しいソートテーブルが、我々は考える必要がある2つのポイントを持って、私たちは離れて実現するために来て、ここで、対話的に変更され、ソート列の一部です
1、カスタムのソート列
Qtはデフォルトの順序のインターフェースを提供しますが、私たちのすべての列を開いた後、ソートをサポートして、私たちは、ソートのQtがトリガされたかを確認するためにはQtのソースコードを勉強する必要があり、この時、私たちがいないことを追加するための合理的な機会サポートソートロジック
ブロガーは、ここで見つけるQHaderView練習は、このクラスを書き換え、マウスダウンを実現オーバーライドし、インターフェイスを持ち上げることで、我々は、ビジネス層は、このインタフェースをソートするために許可されていないかを決定します。
Logicは、このような書き換えられ
ソートされていない場合は、まず既存のすべての列のソート機能を無効にするにはQtのインターフェースを呼び出します
彼のマウス機能を高め親クラスを呼び出します
ソートされていない場合は、すべての列を並べ替えを有効にするには、元のQtインターフェースを呼び出す必要があります
ステップ2は、より論理的なオリジナルのロジックは、ステップ1とステップ3は、調整に論理的なビジネスロジックを実行した後に実行されている、我々は、ソート列は、いくつかの機能を無効達成します
void QRowHeader::mouseReleaseEvent(QMouseEvent * event)
{
int column = logicalIndexAt(event->pos().x());
if (m_Indicator.contains(column)
&& m_Indicator[column] == false
&& qAbs(event->x() - m_pPressPos.x()) < QApplication::startDragDistance()/*非拖拽*/)
{
setSectionsClickable(false);
QHeaderView::mouseReleaseEvent(event);
setSectionsClickable(true);
}
QHeaderView::mouseReleaseEvent(event);
...
コードとして、m_Indicator構造が列に格納されている私たちは、ソートのカスタマイズすることを可能にする、ちょうど外にコードを変更するためのインタフェースを公開し、それらを使用することは非常に簡単ではありません。
void QRowHeader::SetSortEnable(int logicalIndex, bool enable)
{
m_Indicator[logicalIndex] = enable;
}
このようなカラムは、機能のいくつかの並べ替えが達成されて無効にします。
この機能ではいくつかの並べ替え列を無効に比較的よく実現し、結局、ロジックを書き換えることはインタラクションロジックはのソートを見てみましょう変更する方法で、特に複雑ではありません。
2、対話的に変更ソート
前の質問のロードマップでは、この機能は同じまま、私たちは、達成するためにどのように実現する対話ロジックの並べ替えがありますかどうかを確認するために、その後、合理的かつ実際に特定の変数の値をリセットするために、相互作用を書き換えるQtのソースコードで始まりますロジック。
ここではQtのデフォルトのソートの実装をブロガーの追跡が完了した後、私たちは、ソートデータの一部であるすべての最初の、この機能は、特定の難しさである書き換え、他はかつてこれも書き換える必要があるソートするために矢印を描き、有効にソートされました。
それは何を意味するのでしょうか?
一度Qtの照合を有効にし、ソート矢印が描かれます、そしてロジックは、シンプルかつ粗製の矢印が描かれているにもある降順、昇順されていません。
私たちは次のようにソースのQtを描くようにヘッダを見てみましょう
ソート矢印と列をソートする場合は、矢印を描画する必要性をソートし、昇順、降順されていません
私:私はタンク。。。どのような地獄、それは空の列挙にそれを提供することはできませんか?
void QHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
...
if (isSortIndicatorShown() && sortIndicatorSection() == logicalIndex)
opt.sortIndicator = (sortIndicatorOrder() == Qt::AscendingOrder)
? QStyleOptionHeader::SortDown : QStyleOptionHeader::SortUp;
...
}
この道路は死んだ子であるので、我々は唯一のトリッキーな、他の方法で変更することができます。
最後に、天はブロガーを考えるための良い方法、彼らはまだ非常に小さいコードの量で報わ。
戻る我々のニーズの初めに、私たちは本当にちょうど第三のヒットをしたいが、特別な操作は、シングルクリックで最初の第4をクリックしてください。
このことを念頭にした後、その後、マウス以来、それを行うか、彼は非国家として扱わ発注、第三連続でクリックを監視するために、すべての手段によって、リフト機能を書き換えるために、次のクリックは、行きながら、通常のソートロジック。
void QRowHeader::mouseReleaseEvent(QMouseEvent * event)
{
...
QHeaderView::mouseReleaseEvent(event);
column = logicalIndexAt(event->pos().x());
static bool nextNoSort = false;
static int prevColumn = -1;
if (nextNoSort && prevColumn == column
&& qAbs(event->x() - m_pPressPos.x()) < QApplication::startDragDistance())
{
emit RestoreSort();//恢复默认排序
}
if (nextNoSort != true
&& prevColumn == column
&& sectionsClickable()
&& sortIndicatorOrder() == Qt::DescendingOrder)
{
if (qAbs(event->x() - m_pPressPos.x()) < QApplication::startDragDistance())
{
nextNoSort = true;
prevColumn = column;
}
else
{
nextNoSort = false;
}
}
else
{
if (nextNoSort && qAbs(event->x() - m_pPressPos.x()) >= QApplication::startDragDistance())
{
nextNoSort = true;
}
else
{
nextNoSort = false;
prevColumn = column;
}
}
...
}
さて、上記のコード。しかし、ここで強調し、私はそのようにした理由を言うことです!
MouseReleaseEventは、最初にそれ以外の場合は、ドラッグの問題があるだろう、親クラスを呼び出して、あなたが通常のメモリのデータを作ることができる前に、この関数を呼び出す必要があります。
その後、我々はメモリ状態裁判官一連の状態を発注復元するために必要とされていない記録し、あなたはデフォルトのソートを復元することができ、条件が満たされた場合、外部プログラムが信号のみを受信する必要があるRestoreSort信号を発行しました。
デフォルトのソートを復元するには
void QRowTable::RestoreSort()
{
m_pFilter->SetCompareType(QFilterModel::CT_NULL);
m_pFilter->invalidate();
m_pHHeader->setSortIndicator(-1, Qt::DescendingOrder);
}
第四に、関連する記事
QTグリッド制御を実現 - サポートするマルチレベルリストヘッド、マルチレベルの行ヘッダ、セルのマージ、フォント設定など
プロパティブラウザはQtTreePropertyBrowserコンパイルしたDLLをコントロールします(デザイナープラグイン)
優れた記事を見て価値があります:
あなたは記事が良いと思われる場合は、それが与えるかもしれない 報酬を 、書き込みは、あなたのサポートへの感謝は容易ではありません。あなたのサポートが私の最大の動機である、ありがとう!!!
それは重要である - 復刻声明
サイトの記事は、特に指定のない限り、すべての権利予約しますが、オリジナルのソースを指定して、リンク転載方法を使用してください、すべてオリジナルです。同時に、著者は書いている:10夜8に向かったかTwowords
如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。