カスタムコントロールを書くためのQt 36-画像ビューア

I.はじめに

この制御は、主に、簡単な画像ブラウザとして使用されている、あなたはフリップアップでき、表示画像の下、画像は、このような透明度のグラデーションなどの遷移エフェクトをオンにすることができ、アラームのシナリオは、写真が絵を実行参照する必要があります。このコントロールは、ネットワークから、私はちょうどBUGの多くを修正し、非私のオリジナルであり、様々な動作モードを向上させます。そのような空のマウスの右ボタンを追加するように、次/前の最初の/後期次/他の増加しないように移動し、背景色を追加し、キーボードフリップを増加させる
フォルダを開くために、主に、支障を制御し、フォルダが自動的に計算されますキューに格納されているすべてのファイル、キューが画像のフルパスすることができ、また絵することができ、あなたは切り替えることができますが、メモリーモードを選択した場合、自動的に画像のパスにロードされ、その利点があるが、それは、フリップですビュー絵ときメモリは、結局、パスをリロードすることなく、画像に直接表示される画像へのパスと再読み込みハードドライブに必要されているのでスピードは、非常に高速です。

第二に、機能の実現

  • 1:空にするために、マウスの右ボタンを増やします
  • 2:増加は背景色を設定します
  • 3:セットのページアイコンのサイズと間隔を増やします
  • 4:ディスプレイを埋めるストレッチのセットを増やします
  • 5:画像を表示する勾配を増加させるかどうかを設定
  • 6:キーボードの設定ページを増やし
  • 次の移動が増加する/前の最初/最後/:7
  • 8:固定メモリリークや他のバグBUG

第三に、レンダリング

第四に、ヘッダファイルのコード

#ifndef IMAGEVIEW_H
#define IMAGEVIEW_H

/**
 * 图片浏览器控件 作者:feiyangqingyun(QQ:517216493) 2016-10-16
 * 本控件来源于网络(原作者:kimtaikee(http://www.qtcn.org/bbs/read-htm-tid-45436-ds-1.html#tpc))
 * 1:增加鼠标右键清空
 * 2:增加设置背景色
 * 3:增加设置间距和翻页图标大小
 * 4:增加设置是否拉伸填充显示
 * 5:增加设置是否渐变显示图像
 * 6:增加设置键盘翻页
 * 7:增加移动到第一张/末一张/上一张/下一张
 * 8:修正内存泄露BUG及其他BUG
 */

#include <QWidget>

class QToolButton;

class ImageNum : public QWidget
{
    Q_OBJECT
public:
    ImageNum(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *);
    void drawBg(QPainter *painter);
    void drawText(QPainter *painter);

private:
    int totalNum;       //总数
    int currentIndex;   //当前索引

public slots:
    //设置总数
    void setTotalNum(int totalNum);
    //设置当前索引
    void setCurrentIndex(int currentIndex);
};

#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif

class QDESIGNER_WIDGET_EXPORT ImageView : public QWidget
#else
class ImageView : public QWidget
#endif

{
    Q_OBJECT
    Q_PROPERTY(QColor bgColorStart READ getBgColorStart WRITE setBgColorStart)
    Q_PROPERTY(QColor bgColorEnd READ getBgColorEnd WRITE setBgColorEnd)

    Q_PROPERTY(int bottomSpace READ getBottomSpace WRITE setBottomSpace)
    Q_PROPERTY(int buttonSpace READ getButtonSpace WRITE setButtonSpace)
    Q_PROPERTY(QSize icoSize READ getIcoSize WRITE setIcoSize)

    Q_PROPERTY(bool fill READ getFill WRITE setFill)
    Q_PROPERTY(bool fade READ getFade WRITE setFade)
    Q_PROPERTY(bool keyMove READ getKeyMove WRITE setKeyMove)

public:
    explicit ImageView(QWidget *parent = 0);
    ~ImageView();

protected:
    void paintEvent(QPaintEvent *);
    void drawBg(QPainter *painter);
    void drawImage(QPainter *painter);
    void keyPressEvent(QKeyEvent *);
    void resizeEvent(QResizeEvent *);
    void showEvent(QShowEvent *);

private:
    QColor bgColorStart;            //背景渐变开始颜色
    QColor bgColorEnd;              //背景渐变结束颜色

    int bottomSpace;                //底部间距
    int buttonSpace;                //按钮间距
    QSize icoSize;                  //翻页按钮图标大小

    bool fill;                      //是否填充
    bool fade;                      //是否渐变显示
    bool keyMove;                   //是否支持按键移动

    QToolButton *preButton;         //向前移按钮
    QToolButton *nextButton;        //向后移按钮

    QStringList imageNames;         //图片名称集合
    int currentIndex;               //当前图片索引
    QImage currentImage;            //当前图片数据

    ImageNum *num;                  //显示当前索引和总数的对象

    int totalNum;                   //总数
    double opacity;                 //当前透明值
    QTimer *timer;                  //定时器改变透明值

private slots:
    void calcGeo();
    void doFading();

public:
    QColor getBgColorStart()        const;
    QColor getBgColorEnd()          const;

    int getBottomSpace()            const;
    int getButtonSpace()            const;
    QSize getIcoSize()              const;

    bool getFill()                  const;
    bool getFade()                  const;
    bool getKeyMove()               const;

    QSize sizeHint()                const;
    QSize minimumSizeHint()         const;

public slots:
    //载入图像文件夹
    void load();
    void load(const QString &strFolder);

    //清除图像
    void clear();

    //设置背景颜色
    void setBgColorStart(const QColor &bgColorStart);
    void setBgColorEnd(const QColor &bgColorEnd);

    //设置间距
    void setBottomSpace(int bottomSpace);
    void setButtonSpace(int buttonSpace);

    //设置翻页图标大小
    void setIcoSize(const QSize &icoSize);

    //设置图像是否拉伸填充
    void setFill(bool fill);
    //设置是否渐变显示
    void setFade(bool fade);
    //设置键盘按键是否能够移动
    void setKeyMove(bool keyMove);

    //移动到第一张
    void moveFirst();
    //移动到末一张
    void moveLast();
    //上一张
    void movePrevious();
    //下一张
    void moveNext();
    //移动到指定索引图片
    void moveTo(int index);

signals:
    //总数发生改变时触发
    void totalNumChanged(int totalNum);
    //当前图片索引发生改变时触发
    void currentIndexChanged(int currentIndex);
};

#endif // IMAGEVIEW_H

第五に、コアコード

void ImageView::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    drawBg(&painter);

    if (totalNum > 0) {
        drawImage(&painter);
    }
}

void ImageView::drawBg(QPainter *painter)
{
    painter->save();
    painter->setPen(Qt::NoPen);
    QLinearGradient bgGradient(QPoint(0, 0), QPoint(0, height()));
    bgGradient.setColorAt(0.0, bgColorStart);
    bgGradient.setColorAt(1.0, bgColorEnd);
    painter->setBrush(bgGradient);
    painter->drawRect(rect());
    painter->restore();
}

void ImageView::drawImage(QPainter *painter)
{
    painter->save();
    painter->setOpacity(opacity);

    if (fill) {
        painter->drawImage(rect(), currentImage);
        painter->restore();
    } else {
        //按照比例自动居中绘制
        int imageWidth = currentImage.width();
        int imageHeight = currentImage.height();
        int imageX = rect().center().x() - imageWidth / 2;
        int imageY = rect().center().y() - imageHeight / 2;
        QPoint point(imageX, imageY);

        painter->drawImage(point, currentImage);
        painter->restore();
    }
}

void ImageView::keyPressEvent(QKeyEvent *keyEvent)
{
    if (keyEvent->key() == Qt::Key_Left || keyEvent->key() == Qt::Key_Up) {
        movePrevious();
    } else if (keyEvent->key() == Qt::Key_Right || keyEvent->key() == Qt::Key_Down) {
        moveNext();
    }
}

第六に、コントロールが説明します

  1. 以上149絶妙な制御、ように太陰暦、セレクタをスライドさせ、ボタンを強調表示し、ダッシュボードのさまざま、プログレスバー、ボール、コンパス、グラフ、スケール、温度計、ナビゲーションバー、ナビゲーションバー、flatuiの進行を覆い。コントロールの統合の数よりもはるかに多くのQWT。
  2. 各クラスは、以下のプロジェクトのソースコード形式に統合個々の制御を容易にするために、ゼロが符号量を達成するために、各制御ファイルおよびヘッダファイルを結合する、別の対照として、独立して他のファイルとは無関係であることができます。QWT性の高い結合されたコントロールクラスを、連動、すべてのコードが含まれている必要があり、コントロールのいずれかを使用します。
  3. 、描画するために、任意のQtバージョンQt4.6 Qt5.12などmingwの、MSVC、GCCコンパイラのサポートをサポートするために、そのような窓+ Linuxの+マック+文字化けしません組み込みLinuxのような任意のオペレーティングシステムをサポートするすべての純粋なQtの、QWidgetの+ QPainterのを書きます直接のQt Creatorを、組み込みコントロールに統合されており、同じを使用することができ、効果のほとんどは、限り、いくつかのプロパティが設定されているように非常に便利です。
  4. 各制御に対応する制御を含有するDEMO別のソースは、便利な参照を有します。また、すべてのコントロールDEMOの統合された使用を提供します。
  5. 各コントロールのソースコードは、中国の注釈を詳細なカスタムコントロールを書くことを学ぶのは簡単、統一された設計仕様に基づいて作成されています。
  6. 各コントロールのデフォルトの色とデモに対応する色がとても美しいです。
  7. 130以上の可視制御六の不可視コントロール。
  8. 一部のコントロールは、スタイルのスタイルの選択、複数の選択肢のスタイルインジケータを数多く提供しています。
  9. すべてのコントロールは、適応伸ばしフォームを変更します。
  10. ドラッグデザインをサポートする統合デザインカスタム属性、WYSIWYGは、XML形式でインポートおよびエクスポートをサポートしています。
  11. デモに付属しているActiveXコントロールは、すべてのコントロールは、ブラウザのIEで直接実行することができます。
  12. Fontawesome統合グラフィックスフォント+グラフィックフォントの何百ものAlibabaのiconfontコレクション、フォント楽しいグラフィックがもたらします。
  13. 最終的にはすべてのコントロールとDLLの動的ライブラリファイルを生成するには、ドラッグでの使用のために設計されqtcreatorに直接統合することができます。
  14. 次に、ユーザは、大きな需要がある場合は、既にQMLバージョンでは、後者は、PyQtはバージョンを検討します。

七、SDKのダウンロード

  • SDKのダウンロードリンク:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ抽出コード:877p
  • リンクは、動的ライブラリファイルのさまざまなバージョン、すべてのコントロールのヘッダファイル、デモの使用、カスタムコントロール+プロパティのデザイナーに含まれてダウンロードしてください。
  • オープンプラグインのカスタム動的ライブラリの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の、学習、人気の高い技術、キャリア開発、乾燥品の多くは、多くの利益をもたらします!

おすすめ

転載: www.cnblogs.com/feiyangqingyun/p/11234986.html