Qt는 사용자 지정 컨트롤을 작성하는 36- 사진 뷰어를

I. 서론

이 컨트롤은 주로 간단한 이미지 브라우저로 사용하는, 당신이 전환 할 수 있습니다 및 디스플레이 사진 아래 사진은 투명 그라데이션 등의 전환 효과를 켤 수, 알람 시나리오는 사진이 사진을 실행 볼 수 있습니다. 이 컨트롤은 네트워크에서, 난 그냥 버그를 많이 수정, 비 내 원래이며, 다양한 작동 모드를 향상시킬 수 있습니다. 이러한 빈 마우스 오른쪽 버튼을 추가하는 등, 이전 / 다음 첫 번째 / 말 / 다음 다른 증가하지로 이동, 배경 색상을 추가 키보드 플립을 증가
폴더를 엽니 주로 어려움을 컨트롤, 폴더가 자동으로 계산 큐에 저장된 모든 파일은 큐를 사용하면 메모리를 선택하면 모드가 자동으로 사진의 경로에로드, 전환 할 수 있습니다, 또한 그림이 될 수 사진의 전체 경로가 될 수 있으므로 이점, 즉, 플립이있다 메모리가 그림에, 결국, 경로를 다시로드 할 필요없이, 그림에서 직접 경로를 표시 할 필요가 있기 때문에 속도가 매우 빠르고,보기 사진 하드 드라이브를 다시는 읽기.

기능 둘째, 실현

  • 1 : 비워 마우스 오른쪽 버튼을 증가
  • 2 : 증가는 배경 색상을 설정
  • 3 : 설정 페이지 아이콘의 크기와 간격을 증가
  • 4 : 디스플레이를 채우기 연신 세트를 증대
  • 5 : 화상 표시 구배를 증가 여부를 설정
  • 6 : 증가 키보드 설정 페이지
  • 처음 / 끝 / 이전 / 다음 이동 증가 : 7
  • 8 : 고정 메모리 누수 및 기타 버그 버그

셋째, 렌더링

넷째, 헤더 파일 코드

#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를,는 QWidget + QPainter를가립니다 어떤 Qt는 버전 Qt4.6 Qt5.12 등와 Mingw, MSVC, GCC 컴파일러에 대한 지원을 지원하기 위해 쓰기와 같은 왜곡하지 않는 윈도우 + 리눅스 + 맥 + 임베디드 리눅스로 모든 운영 시스템을 지원 직접 Qt는 창조주, 내장 된 컨트롤에 통합 및이를 사용할 수 있고, 효과의 대부분은 한 여러 속성이 설정되므로 매우 편리 할 수 ​​있습니다.
  4. 각 컨트롤에 대응하는 제어를 포함하는 별도의 소스 DEMO 편리한 참조를 갖는다. 또한 모든 컨트롤 데모의 통합 사용을 제공합니다.
  5. 각 컨트롤에 대한 소스 코드는 중국 주석을 자세히 사용자 지정 컨트롤을 작성하는 배우기 쉽고, 통합 된 설계 사양에 따라 준비가되어있다.
  6. 각 컨트롤의 기본 색상 및 데모 해당 색상이 매우 아름답습니다.
  7. 130 개 이상의 표시 제어 여섯 개 보이지 제어.
  8. 부분 제어 스타일 스타일 선택, 객관식 스타일 표시의 다양한 제공합니다.
  9. 모든 컨트롤 변경 뻗어 양식을 적응 적.
  10. 드래그 설계를 지원하는 통합 디자인 사용자 지정 특성은, WYSIWYG XML 형식으로 가져 오기 및 내보내기를 지원합니다.
  11. 데모와 함께 제공 ActiveX 컨트롤은 모든 컨트롤은 브라우저 IE에서 직접 실행할 수 있습니다.
  12. Fontawesome 통합 그래픽 글꼴 + 그래픽 글꼴의 수백 알리바바 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) 삼봉 낙타 (QQ : 278969898).
  • Qt의 고급 열이 거의 Taoge의 길을 알고 https://zhuanlan.zhihu.com/TaoQt
  • 에 오신 것을 환영합니다 관심 공공 마이크로 채널 번호] [효율적 프로그래머, 콘텐츠 C + +를 / 파이썬, 학습, 기술, 인기있는 기술, 경력 개발을 쓰고, 건조 제품의 많은, 많은 혜택을!

추천

출처www.cnblogs.com/feiyangqingyun/p/11234986.html