I.はじめに
最後の書き込みデータの視覚化、大画面のデジタルサイネージシステムで変換を達成するために言及する際、柱状部マップ、水平棒グラフ、水平部マップをヒントをホバーQCustomPlot。個々のリストが記載されているが、多くの人々があり、このような新しいQChartモジュールの後Qt5.7、このカーブ、それをサポートするデータの量と実際にはないQChart、またはechart他の形態、私が試してみましたこれらの2つの方法が、なぜ疑問小さな、特に10W支援よりもデータの量、単にスラグスラグ、だけでなく、アニメーションなどの利点をたくさん持っている、非常に厄介な、使用に非常に適して、私は彼の完全なソースコードを読んで、このプロセスは非常に良いアニメーションですでも軸がアニメーションを持ち、さまざまな効果をサポートするだけでなく、色にスラグスラグ美的プログラマの多くは自分自身を排除し、テーマスキンのセットの多くを建てことができ、これは実際には非常に便利です。QCustomPlotの変換はチャートのエフェクト・ユーザー・ニーズの多様を実施することを決定した後ろechartについては、ブラウザコントロールに依存しなければならない、リソースの消費量は、比較的高いです。
変換プロセスを通じて、グローバルスタイルの変更をサポートしながら、すべてのユーザーフレンドリーな機能にパッケージ化、パラメータは、渡すことができ、全体的な色の変化を制御するために、スタイルシートのサポートは、そのようなポップアップ位置情報をホバリングなどとして、多くの詳細を検討し、自動的に最良かつ最も合理的な位置を計算し表示されます。多くの人が使用QCustomPlot1.0考慮して、だけでなく、特別に完全に互換性QCustomPlot1.0と2.0を作りました。
第二に、機能の実現
- 1:XとY軸の値の範囲を提供することができます
- 2:テキストは、背景色+ +カラーカラーメッシュを設定することができます
- 3:色曲線は、+三色のセットを提供することができます
- 4:水平および垂直位置決め十字線を表示するかどうかを設定することができ、それぞれ、設けられていてもよいです
- 5:幅と色は十字線を設けてもよいです
- 6:表示サイズは、データポイントとデータポイントかどうかを設定することができます
- 7:背景領域は、図2に形成された充填するか否かを設定することができます。
- 8: - ドラッグ+スケーリングモードを設定することができます
- 9:ピッチ軸は、第2の座標系の可視+を設けてもよいです
- 10:直接インタフェースsetDataLine曲線、支持体の複数を提供
- 11:図をサポート積層を複数形成、界面直接setDataBarヒストグラムを提供します。
- 12:インターフェイスはsetLabsを提供する代替テキストラベルキーを提供
- 13:インタフェースが提供+ +クリア外部QCustomPlot取得したオブジェクトを再描画します
- 14:+ストップが正弦波をシミュレートする機能を提供開始
- 15:位置値を設定してもよいヒストグラム+ +カラー精度
- 16:支持点のデータポイントに強調表示されたデータを移動するためのマウス、および表示データメッセージ
- 17:プレゼンテーション情報が自動的に+ + + +右上、左下、右下+左+ + +左下隅、右上隅の処理を位置決めするために設けられていてもよいです
- 18:データ・セットが各ピラー異なる背景色が生成されたデータに基づくことができるヒストグラムなど、異なる背景色で製造することができるかどうかをチェック
- 19:あなたは、行の凡例の凡例の位置+ +伝説の数を表示するかどうかを設定することができます
- 20:柱状図を積層サポートする複数のヒストグラム曲線+ + +横円筒部マップヒストグラム+ +横筒部マップ
- 21:内蔵絶妙な色の15組、色の手間をなくし、色を取るように設定された自動カラー
- 22:QCustomPlot 1.0とQCustomPlot 2.0をサポート
第三に、レンダリング
第四に、コアコード
void CustomPlot::setDataLine(int index, const QString &name, const QVector<double> &key, const QVector<double> &value)
{
if (customPlot->graphCount() > index) {
customPlot->graph(index)->setName(name);
customPlot->graph(index)->setData(key, value);
customPlot->xAxis->setRange(-offsetX, key.count() + offsetX, Qt::AlignLeft);
//超过3条线条颜色设置颜色集合的颜色
if (index >= 3) {
setColor(index, colors.at(index));
} else {
setColor(0, colors.at(0));
setColor(1, colors.at(1));
setColor(2, colors.at(2));
}
}
}
void CustomPlot::setDataBarv(const QStringList &rowNames,
const QStringList &columnNames,
const QList<QVector<double> > &values,
const QColor &borderColor,
int valuePosition,
int valuePrecision,
const QColor &valueColor,
bool checkData)
{
//只有1列的才能设置
if (columnNames.count() != 1) {
return;
}
//可以直接用堆积图,因为只有一列的柱状图不会形成堆积
setDataBars(rowNames, columnNames, values, borderColor, valuePosition, valuePrecision, valueColor, checkData);
}
void CustomPlot::setDataBarvs(const QStringList &rowNames,
const QStringList &columnNames,
const QList<QVector<double> > &values,
const QColor &borderColor,
int valuePosition,
int valuePrecision,
const QColor &valueColor,
bool checkData)
{
//过滤个数不一致数据,防止索引越界
int rowCount = rowNames.count();
int columnCount = columnNames.count();
int valueCount = values.count();
if (columnCount == 0 || valueCount == 0 || columnCount != valueCount) {
return;
}
//设置网格线不显示,会更好看
customPlot->xAxis->grid()->setVisible(false);
//customPlot->yAxis->grid()->setVisible(false);
//设置横坐标文字描述
QVector<double> ticks;
QVector<QString> labels;
int count = rowCount * columnCount;
for (int i = 0; i < rowCount; i++) {
ticks << 1.5 + (i * columnCount);
labels << rowNames.at(i);
}
setLabX(ticks, labels);
customPlot->xAxis->setRange(0, count + 1);
for (int i = 0; i < columnCount; i++) {
//同样也要先过滤个数是否符合要求
QVector<double> value = values.at(i);
if (rowCount != value.count()) {
continue;
}
//创建柱状图
CustomBarv *bar = new CustomBarv(customPlot->xAxis, customPlot->yAxis);
bar->setCheckData(checkData);
//设置宽度比例
bar->setWidth(0.9);
//设置显示值的位置 0-不绘制 1-顶部上面 2-顶部居中 3-中间居中 4-底部居中
bar->setValuePostion(valuePosition);
bar->setValuePrecision(valuePrecision);
bar->setValueColor(valueColor);
//设置名称
bar->setName(columnNames.at(i));
//设置颜色,取颜色集合
QColor color = QColor(51, 204, 255);
if (i < colors.count()) {
color = colors.at(i);
}
//边缘高亮,如果传入了边框颜色则取边框颜色
bar->setPen(QPen(borderColor == Qt::transparent ? color.light(150) : borderColor));
bar->setBrush(color);
//这个算法很巧妙,想了很久
QVector<double> ticks;
double offset = i * 0.9;
for (int j = 0; j < rowCount; j++) {
ticks << 1.0 + (j * columnCount) + offset;
}
//设置数据
bar->setData(ticks, value);
}
}
void CustomPlot::setDataBarh(const QStringList &rowNames,
const QStringList &columnNames,
const QList<QVector<double> > &values,
const QColor &borderColor,
int valuePosition,
int valuePrecision,
const QColor &valueColor,
bool checkData)
{
//只有1列的才能设置
if (columnNames.count() != 1) {
return;
}
//过滤个数不一致数据,防止索引越界
int rowCount = rowNames.count();
int columnCount = columnNames.count();
int valueCount = values.count();
if (columnCount == 0 || valueCount == 0 || columnCount != valueCount) {
return;
}
//设置网格线不显示,会更好看
customPlot->xAxis->grid()->setVisible(false);
customPlot->yAxis->grid()->setVisible(false);
customPlot->yAxis->setTickLength(0, 0);
//设置横坐标文字描述
QVector<double> ticks;
QVector<QString> labels;
int count = rowCount * columnCount;
double padding = 1;
for (int i = 0; i < rowCount; i++) {
ticks << padding + (i * columnCount);
labels << rowNames.at(i);
}
setLabY(ticks, labels);
customPlot->yAxis->setRange(0, count + 1);
//先计算出每个柱子占用的高度
double barHeight = 0.7;
for (int i = 0; i < columnCount; i++) {
//同样也要先过滤个数是否符合要求
QVector<double> value = values.at(i);
if (rowCount != value.count()) {
continue;
}
//先绘制系列1的数据,再绘制系列2,依次类推
for (int j = 0; j < rowCount; j++) {
//创建横向柱状图
double y = (0.67 + (j * columnCount));
CustomBarh *bar = new CustomBarh(customPlot);
bar->setCheckData(checkData);
bar->setRect(QPointF(0, y), QPointF(value.at(j), y + barHeight));
bar->setValue(value.at(j));
//设置显示值的位置 0-不绘制 1-顶部上面 2-顶部居中 3-中间居中 4-底部居中
bar->setValuePostion(valuePosition);
bar->setValuePrecision(valuePrecision);
bar->setValueColor(valueColor);
//设置颜色,取颜色集合
QColor color = QColor(51, 204, 255);
if (i < colors.count()) {
color = colors.at(i);
}
//边缘高亮,如果传入了边框颜色则取边框颜色
bar->setPen(QPen(borderColor == Qt::transparent ? color.light(150) : borderColor));
bar->setBrush(color);
}
}
}
void CustomPlot::setDataBarhs(const QStringList &rowNames,
const QStringList &columnNames,
const QList<QVector<double> > &values,
const QColor &borderColor,
int valuePosition,
int valuePrecision,
const QColor &valueColor,
bool checkData)
{
//过滤个数不一致数据,防止索引越界
int rowCount = rowNames.count();
int columnCount = columnNames.count();
int valueCount = values.count();
if (columnCount == 0 || valueCount == 0 || columnCount != valueCount) {
return;
}
//设置网格线不显示,会更好看
customPlot->xAxis->grid()->setVisible(false);
customPlot->yAxis->grid()->setVisible(false);
customPlot->yAxis->setTickLength(0, 0);
customPlot->xAxis->setVisible(false);
//设置横坐标文字描述
QVector<double> ticks;
QVector<QString> labels;
int count = rowCount * columnCount;
//这个算法想了很久,很牛逼
double padding = 1.5 + (columnCount - 2) * 0.4;
for (int i = 0; i < rowCount; i++) {
ticks << padding + (i * columnCount);
labels << rowNames.at(i);
}
setLabY(ticks, labels);
customPlot->yAxis->setRange(0, count + 1);
//先计算出每个柱子占用的高度
double barHeight = 0.8;
for (int i = 0; i < columnCount; i++) {
//同样也要先过滤个数是否符合要求
QVector<double> value = values.at(i);
if (rowCount != value.count()) {
continue;
}
//先绘制系列1的数据,再绘制系列2,依次类推
for (int j = 0; j < rowCount; j++) {
//创建横向柱状图
double y = (0.7 + i * barHeight + (j * columnCount));
CustomBarh *bar = new CustomBarh(customPlot);
bar->setCheckData(checkData);
bar->setRect(QPointF(0, y), QPointF(value.at(j), y + barHeight));
bar->setValue(value.at(j));
//设置显示值的位置 0-不绘制 1-顶部上面 2-顶部居中 3-中间居中 4-底部居中
bar->setValuePostion(valuePosition);
bar->setValuePrecision(valuePrecision);
bar->setValueColor(valueColor);
//设置颜色,取颜色集合
QColor color = QColor(51, 204, 255);
if (j < colors.count()) {
color = colors.at(j);
}
//边缘高亮,如果传入了边框颜色则取边框颜色
bar->setPen(QPen(borderColor == Qt::transparent ? color.light(150) : borderColor));
bar->setBrush(color);
}
}
}
void CustomPlot::setDataBars(const QStringList &rowNames,
const QStringList &columnNames,
const QList<QVector<double> > &values,
const QColor &borderColor,
int valuePosition,
int valuePrecision,
const QColor &valueColor,
bool checkData)
{
//过滤个数不一致数据,防止索引越界
int rowCount = rowNames.count();
int columnCount = columnNames.count();
int valueCount = values.count();
if (columnCount == 0 || valueCount == 0 || columnCount != valueCount) {
return;
}
//设置网格线不显示,会更好看
customPlot->xAxis->grid()->setVisible(false);
//customPlot->yAxis->grid()->setVisible(false);
//先清空原有柱状图
bars.clear();
//设置横坐标文字描述
QVector<double> ticks;
QVector<QString> labels;
for (int i = 0; i < rowCount; i++) {
ticks << i + 1;
labels << rowNames.at(i);
}
setLabX(ticks, labels);
customPlot->xAxis->setRange(0, rowCount + 1);
for (int i = 0; i < columnCount; i++) {
//同样也要先过滤个数是否符合要求
QVector<double> value = values.at(i);
if (rowCount != value.count()) {
continue;
}
//创建柱状堆积图
CustomBarv *bar = new CustomBarv(customPlot->xAxis, customPlot->yAxis);
bar->setCheckData(checkData);
//设置宽度比例
bar->setWidth(0.6);
//设置显示值的位置 0-不绘制 1-顶部上面 2-顶部居中 3-中间居中 4-底部居中
bar->setValuePostion(valuePosition);
bar->setValuePrecision(valuePrecision);
bar->setValueColor(valueColor);
#ifndef old
//设置堆积间隙
if (borderColor != Qt::transparent) {
bar->setStackingGap(1);
}
#endif
//设置名称
bar->setName(columnNames.at(i));
//设置颜色,取颜色集合
QColor color = QColor(51, 204, 255);
if (i < colors.count()) {
color = colors.at(i);
}
//边缘高亮,如果传入了边框颜色则取边框颜色
if (columnCount > 1 && borderColor == Qt::transparent) {
bar->setPen(Qt::NoPen);
} else {
bar->setPen(QPen(borderColor == Qt::transparent ? color.light(150) : borderColor));
}
bar->setBrush(color);
//设置堆积层叠顺序,后面那个移到前一个上面
bars << bar;
if (i > 0) {
bar->moveAbove(bars.at(i - 1));
}
//设置数据
bar->setData(ticks, value);
}
}
第五に、コントロールを導入
- 以上146絶妙な制御、ように太陰暦、セレクタをスライドさせ、ボタンを強調表示し、ダッシュボードのさまざま、プログレスバー、ボール、コンパス、グラフ、スケール、温度計、ナビゲーションバー、ナビゲーションバー、flatuiの進行を覆い。コントロールの統合の数よりもはるかに多くのQWT。
- 各クラスは、以下のプロジェクトのソースコード形式に統合個々の制御を容易にするために、ゼロが符号量を達成するために、各制御ファイルおよびヘッダファイルを結合する、別の対照として、独立して他のファイルとは無関係であることができます。QWT性の高い結合されたコントロールクラスを、連動、すべてのコードが含まれている必要があり、コントロールのいずれかを使用します。
- 、描画するために、任意のQtバージョンQt4.6 Qt5.12などmingwの、MSVC、GCCコンパイラのサポートをサポートするために、そのような窓+ Linuxの+マック+文字化けしません組み込みLinuxのような任意のオペレーティングシステムをサポートするすべての純粋なQtの、QWidgetの+ QPainterのを書きます直接のQt Creatorを、組み込みコントロールに統合されており、同じを使用することができ、効果のほとんどは、限り、いくつかのプロパティが設定されているように非常に便利です。
- 各制御に対応する制御を含有するDEMO別のソースは、便利な参照を有します。また、すべてのコントロールDEMOの統合された使用を提供します。
- 各コントロールのソースコードは、中国の注釈を詳細なカスタムコントロールを書くことを学ぶのは簡単、統一された設計仕様に基づいて作成されています。
- 各コントロールのデフォルトの色とデモに対応する色がとても美しいです。
- 130以上の可視制御六の不可視コントロール。
- 一部のコントロールは、スタイルのスタイルの選択、複数の選択肢のスタイルインジケータを数多く提供しています。
- すべてのコントロールは、適応伸ばしフォームを変更します。
- ドラッグデザインをサポートする統合デザインカスタム属性、WYSIWYGは、XML形式でインポートおよびエクスポートをサポートしています。
- デモに付属しているActiveXコントロールは、すべてのコントロールは、ブラウザのIEで直接実行することができます。
- Fontawesome統合グラフィックスフォント+グラフィックフォントの何百ものAlibabaのiconfontコレクション、フォント楽しいグラフィックがもたらします。
- 最終的にはすべてのコントロールとDLLの動的ライブラリファイルを生成するには、ドラッグでの使用のために設計されqtcreatorに直接統合することができます。
- 次に、ユーザは、大きな需要がある場合は、既にQMLバージョンでは、後者は、PyQtはバージョンを検討します。
六、SDKのダウンロード
- SDKのダウンロードリンク:https://pan.baidu.com/s/1tD9v1YPfE2fgYoK6lqUr1Q抽出コード:lyhk
- +カスタムデザイナー感謝属性:https://pan.baidu.com/s/1l6L3rKSiLu_uYi7lnL3ibQ抽出コード:tmvl
- ダウンロードリンクは、動的ライブラリファイル、すべてのコントロールのヘッダファイル、デモの使用のさまざまなバージョンに含まれています。
- オープンプラグインのカスタム動的ライブラリのdllを使用(永久無料)、及び任意の制限なし、バックドア、使いやすさ。
- qt5.12.3 msvc2017 32 + 64 mingwの32 + 64内を含む26現在利用可能バージョンのDLL、。
- コントロールを向上させ、コントロールを改善するために、随時、定期的に更新SDK、すべての提案を歓迎するために、ありがとうございました!
- ウィジェットバージョン(QQ:517216493)QMLバージョン(QQ:373955953)sambongラクダ(QQ:278969898)。
- Qtの高度な列はほとんどTaogeの道を知っているhttps://zhuanlan.zhihu.com/TaoQt
- スキルを書くようこそ懸念公共マイクロチャネル番号] [効率的なプログラマー、コンテンツC ++ / Pythonの、学習、人気の高い技術、キャリア開発、乾燥品の多くは、多くの利益をもたらします!