本控件主要用來做爲一個簡單的圖片瀏覽器使用,能夠上下翻頁顯示圖片,圖片還能夠開啓過分效果好比透明度漸變,應用場景有查看報警圖片運行圖片等。此控件非本人原創,來源於網絡,我只是修正了好多處BUG,並完善了各類操做方式。好比增長鼠標右鍵清空、增長背景色、增長鍵盤翻頁、增長移動到第一張/末一張/上一張/下一張 等, 控件沒有什麼難度,主要就是打開文件夾,自動計算文件夾下的全部文件存儲到隊列中,隊列中能夠是圖片的完整路徑,也能夠是圖片,能夠切換,若是選擇內存加載模式則會自動將路徑轉爲圖片,這樣的話有個好處,就是在翻頁查看圖片的時候速度會很是的快,由於直接顯示的是內存中的圖片,而不須要從新加載路徑,畢竟路徑加載圖片又須要從新讀取硬盤。html
#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(); } }