0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用QPushButton與QLabel組件實(shí)現(xiàn)一個(gè)簡(jiǎn)單的批量圖像瀏覽

OpenCV學(xué)堂 ? 來(lái)源:OpenCV開(kāi)發(fā)者聯(lián)盟 ? 2023-01-31 11:58 ? 次閱讀

引言

基于前面幾篇文章介紹的知識(shí)點(diǎn),使用QPushButton與QLabel組件結(jié)合水平與垂直布局管理器,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的批量圖像瀏覽,支持圖像文件夾選擇、按鈕信號(hào)觸發(fā)與槽函數(shù)響應(yīng)、支持上一張、下一張圖像瀏覽,實(shí)現(xiàn)一個(gè)最簡(jiǎn)化版本的圖像瀏覽器

垂直與水平布局混合使用

PyQT5中的QWidget對(duì)象支持嵌套方式,在一個(gè)QWidget中可以支持多個(gè)子QWidget對(duì)象,每個(gè)QWidget都有自己的布局方式,這樣通過(guò)多重QWidget嵌套與疊加就可以實(shí)現(xiàn)復(fù)雜界面設(shè)計(jì)。在我開(kāi)發(fā)OpenMV工具軟件過(guò)程中,多數(shù)子界面都是通過(guò)水平跟垂直布局嵌入實(shí)現(xiàn)的界面設(shè)計(jì)。這樣做的好處是避免使用絕對(duì)定位方式布局組件元素導(dǎo)致不同分辨率的顯示差異與用戶體驗(yàn)不一致。

e280a1de-a113-11ed-bfe3-dac502259ad0.png

上圖中第一行有三個(gè)組元素,兩個(gè)QLabel,分別顯示當(dāng)前文件路徑與文件夾總圖像數(shù)目;一個(gè)按鈕實(shí)現(xiàn)圖像文件夾選擇功能,三個(gè)組件元素在一個(gè)子QWidget對(duì)象(panel1)中通過(guò)水平布局方式(QHBoxLayout)從左到右排列。

內(nèi)置圖標(biāo)ICON使用

PyQT5的QStyle支持內(nèi)置圖標(biāo)ICON支持,支持常見(jiàn)應(yīng)用程序開(kāi)發(fā)所需要的圖標(biāo),直接使用這些圖標(biāo)可以省去很多麻煩。支持的圖標(biāo)列表請(qǐng)看下圖說(shuō)明:

e2a518ac-a113-11ed-bfe3-dac502259ad0.png

采用下面的相似代碼即可獲取需要的ICON圖標(biāo)使用。

back_pix = QtWidgets.QStyle.SP_ArrowBack
back_icon = self.style().standardIcon(back_pix)
圖表文件名稱列表如下:

e2cf4906-a113-11ed-bfe3-dac502259ad0.png

中間是一個(gè)QLabel組件實(shí)現(xiàn)圖像顯示與更新功能 最后一行基于PyQT5的QStyle中內(nèi)置圖標(biāo)引用實(shí)現(xiàn)了兩個(gè)ICON按鈕功能,支持Tooltip提示功能,分別實(shí)現(xiàn)顯示上一張與下一張圖像切換顯示功能。兩個(gè)ICON按鈕通過(guò)水平布局方式同樣放在一個(gè)QWidget對(duì)象(panel2)中。

最終把panel1、imageLabel、panel2三個(gè)子元素通過(guò)垂直布局(QVBoxLayout)添加到自定義的QWidget對(duì)象-ImageBrowserPanel。

最后在主程序中初始化ImageBrowserPanel對(duì)象實(shí)例,設(shè)置為QMainWindow的CenteralWidget即可完成。

按鈕信號(hào)與響應(yīng)

三個(gè)按鈕分別完成圖像文件夾選擇、上一張更新顯示、下一張更新顯示。默認(rèn)選擇圖像文件夾之后會(huì)顯示該文件夾中第一張圖像,同時(shí)更新文件顯示QLabel上顯示信息與imageLabel上顯示的圖像內(nèi)容。

運(yùn)行演示與代碼

運(yùn)行結(jié)果演示:

e2e62db0-a113-11ed-bfe3-dac502259ad0.gif

主面板界面類代碼如下:


class ImageBrowserPanel(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.image_files = []
        self.current_index = -1
        # 文本標(biāo)簽
        self.pathLabel = QtWidgets.QLabel()
        self.pathLabel.setText("文件名稱: test.png")
        self.pathLabel.setStyleSheet("background-color:deeppink; color: blue; border-radius:5px")
        self.pathLabel.setAlignment(QtCore.Qt.AlignCenter)
        # 圖像總數(shù)
        self.numLabel = QtWidgets.QLabel()
        self.numLabel.setText("圖像總數(shù): 0")
        self.pathLabel.setStyleSheet("background-color:deeppink; color: blue; border-radius:5px")
        self.numLabel.setAlignment(QtCore.Qt.AlignCenter)


        fileBtn = QtWidgets.QPushButton("選擇...")
        hbox_layout = QtWidgets.QHBoxLayout()
        hbox_layout.addWidget(self.pathLabel)
        hbox_layout.addWidget(self.numLabel)
        hbox_layout.addWidget(fileBtn)
        hbox_layout.addStretch(1)
        panel1 = QtWidgets.QGroupBox("圖像信息")
        panel1.setLayout(hbox_layout)


        # 圖像標(biāo)簽
        self.imgLabel = QtWidgets.QLabel()
        pixmap = QtGui.QPixmap("test3.png")
        pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
        self.imgLabel.setPixmap(pix)
        self.imgLabel.setAlignment(QtCore.Qt.AlignCenter)


        # 左右瀏覽
        back_pix = QtWidgets.QStyle.SP_ArrowBack
        back_icon = self.style().standardIcon(back_pix)


        forward_pix = QtWidgets.QStyle.SP_ArrowForward
        forward_icon = self.style().standardIcon(forward_pix)


        backBtn = QtWidgets.QPushButton(back_icon, "")
        backBtn.setIconSize(QtCore.QSize(48, 48))
        backBtn.setToolTip("上一張")


        forwardBtn = QtWidgets.QPushButton(forward_icon, "")
        forwardBtn.setIconSize(QtCore.QSize(48, 48))
        forwardBtn.setToolTip("下一張")


        panel2 = QtWidgets.QWidget()
        hbox_layout2 = QtWidgets.QHBoxLayout()
        hbox_layout2.addWidget(backBtn)
        hbox_layout2.addWidget(forwardBtn)
        panel2.setLayout(hbox_layout2)


        # 添加到布局管理器中
        vbox_layout = QtWidgets.QVBoxLayout()
        vbox_layout.addWidget(panel1)
        vbox_layout.addWidget(self.imgLabel)
        vbox_layout.addWidget(panel2)
        vbox_layout.addStretch(1)


        # 面板容器
        self.setLayout(vbox_layout)


        # setup listener
        fileBtn.clicked.connect(self.on_select_image_dir)
        backBtn.clicked.connect(self.on_back_image_view)
        forwardBtn.clicked.connect(self.on_forward_image_view)


    def on_back_image_view(self):
        if self.current_index > 0:
            self.current_index = self.current_index - 1
            filename = self.image_files[self.current_index]
            self.pathLabel.setText("文件名稱: " + filename)
            print(filename)
            pixmap = QtGui.QPixmap(filename)
            pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
            self.imgLabel.setPixmap(pix)


    def on_forward_image_view(self):
        last = len(self.image_files) - 1
        if self.current_index < last:
            self.current_index = self.current_index + 1
            filename = self.image_files[self.current_index]
            self.pathLabel.setText("文件名稱: " + filename)
            print(filename)
            pixmap = QtGui.QPixmap(filename)
            pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
            self.imgLabel.setPixmap(pix)


    def on_select_image_dir(self):
        img_dir = QtWidgets.QFileDialog.getExistingDirectory(self, "圖像文件夾", ".")
        files = os.listdir(img_dir)
        self.image_files.clear()
        self.current_index = -1
        for f in files:
            if f.endswith(".png") or f.endswith(".jpg") or f.endswith(".bmp"):
                self.image_files.append(os.path.join(img_dir, f))
        if len(self.image_files) > 0:
            self.current_index = 0
            filename = self.image_files[0]
            print(filename)
            self.pathLabel.setText("文件名稱: " + filename)
            self.numLabel.setText("圖像總數(shù): " + str(len(self.image_files)))
            pixmap = QtGui.QPixmap(filename)
            pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
            self.imgLabel.setPixmap(pix)
上述代碼演示了如何打開(kāi)文件夾,遍歷圖像文件、如何更新QLabel上顯示的圖像與文字信息,如何構(gòu)建一個(gè)自定義的QWidget對(duì)象。

QApplication應(yīng)用程序代碼如下:

# 初始化APP實(shí)例
app = QtWidgets.QApplication(sys.argv)
# 初始化桌面容器
main_win = QtWidgets.QMainWindow()
# 設(shè)置APP窗口名稱
main_win.setWindowTitle("PyQT5圖像瀏覽器-2號(hào)高手")
# 初始化內(nèi)容面板
content_panel = ImageBrowserPanel()
# 設(shè)置窗口大小
main_win.setMinimumSize(640, 500)
main_win.setCentralWidget(content_panel)


# 請(qǐng)求顯示
main_win.show()
# 加載窗口并啟動(dòng)App
app.exec()

運(yùn)行結(jié)果如下:

e2f655f0-a113-11ed-bfe3-dac502259ad0.png?總結(jié)

本文主要是演示了PyQT5中水平與垂直布局組合,多個(gè)QWidget組件嵌套使用排版,按鈕事件觸發(fā)與槽函數(shù)更新UI組件的各種PyQT5基本編程技能與技巧。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • pyqt5
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3384
  • openMV
    +關(guān)注

    關(guān)注

    3

    文章

    39

    瀏覽量

    9763

原文標(biāo)題:PyQT5開(kāi)發(fā)案例之簡(jiǎn)易圖像瀏覽器

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Visual C# 打造 “瀏覽器”

    “AxSHDocVw”,在此命名空間中定義了個(gè)“AxWebBrowser”組件,這個(gè)組件中有若干個(gè)方法和屬性,Visual C#就是通過(guò)這些方法和屬性來(lái)
    發(fā)表于 02-20 10:25

    關(guān)于QT中使用pixmap進(jìn)行圖片的切換問(wèn)題

    /my_program/picture/picture.jpg"; QLabel *label=new QLabel; button_change=new QPushButton("
    發(fā)表于 01-20 15:04

    《Visual C# 2008程序設(shè)計(jì)經(jīng)典案例設(shè)計(jì)與實(shí)現(xiàn)》---利用TreeView控件瀏覽圖像

    《Visual C# 2008程序設(shè)計(jì)經(jīng)典案例設(shè)計(jì)與實(shí)現(xiàn)》---利用TreeView控件瀏覽圖像.zip
    發(fā)表于 05-22 21:05

    如何才能允許組件分組并添加個(gè)簡(jiǎn)單的片外終端組件?

    包含在個(gè)組中。這兩個(gè)問(wèn)題的個(gè)很好的解決方案是允許組件被分組并且具有非常
    發(fā)表于 10-18 09:53

    請(qǐng)問(wèn)怎么把STM32F7NG寫(xiě)成個(gè)簡(jiǎn)單瀏覽器?

    怎么可以把STM32F7NG寫(xiě)成個(gè)簡(jiǎn)單瀏覽器,能顯示只有圖片和文字的HTML代碼或文件.
    發(fā)表于 03-10 05:14

    使用JS實(shí)現(xiàn)簡(jiǎn)單的HarmonyOS購(gòu)物應(yīng)用

    1. 介紹本篇Codelab將會(huì)使用UI組件開(kāi)發(fā)出個(gè)HarmonyOS購(gòu)物應(yīng)用。HarmonyOS為開(kāi)發(fā)者提供了多種組件,每個(gè)組件通過(guò)對(duì)數(shù)
    發(fā)表于 09-23 10:40

    怎么去解決QLabel控件無(wú)法播放GIF動(dòng)畫(huà)的問(wèn)題

    ubuntu系統(tǒng)上gif動(dòng)畫(huà)播放正常,移植到arm上的應(yīng)用程序是正常啟動(dòng)的,但QLabel控件上無(wú)法播放GIF動(dòng)畫(huà)。QLabel控件上圖片是可以正常顯示的。 QMovie *movie = new
    發(fā)表于 01-10 07:40

    【飛凌RK3568開(kāi)發(fā)板試用體驗(yàn)】5-Qt開(kāi)發(fā)個(gè)相冊(cè)瀏覽

    本篇繼續(xù)來(lái)實(shí)現(xiàn)個(gè)Qt相冊(cè)瀏覽器軟件,可以實(shí)現(xiàn)OK3568-C板子中圖片的查看,方便后面制作相機(jī)拍照功能后,可以查看拍出的照片,先來(lái)看下最終
    發(fā)表于 12-08 22:32

    基于Mobile的手機(jī)流媒體實(shí)時(shí)圖像瀏覽客戶端設(shè)計(jì)

    本文主要闡述基于Mobile 的手機(jī)流媒體實(shí)時(shí)圖像瀏覽客戶端的軟件設(shè)計(jì),此軟件是通過(guò)軟件仿真實(shí)現(xiàn)個(gè)基于Windows Mobile的流媒
    發(fā)表于 09-27 10:41 ?1106次閱讀
    基于Mobile的手機(jī)流媒體實(shí)時(shí)<b class='flag-5'>圖像</b><b class='flag-5'>瀏覽</b>客戶端設(shè)計(jì)

    comicsviewer圖像瀏覽器軟件

    電子發(fā)燒友網(wǎng)站提供《comicsviewer圖像瀏覽器軟件.zip》資料免費(fèi)下載
    發(fā)表于 06-19 17:00 ?0次下載

    使用Visual Baisc實(shí)現(xiàn)簡(jiǎn)單的文件瀏覽器的程序和工程文件

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用Visual Baisc實(shí)現(xiàn)簡(jiǎn)單的文件瀏覽器的程序和工程文件。
    發(fā)表于 09-18 16:48 ?14次下載
    使用Visual Baisc<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>簡(jiǎn)單</b>的文件<b class='flag-5'>瀏覽</b>器的程序和工程文件

    易于使用的openharmony圖像組件PhotoView的實(shí)現(xiàn)

    PhotoView 旨在幫助生成個(gè)易于使用的縮放 openharmony 圖像組件實(shí)現(xiàn)。 特征: 開(kāi)箱即用的縮放,使用多點(diǎn)觸控和雙擊。
    發(fā)表于 04-11 10:30 ?2次下載

    QT|編寫(xiě)個(gè)簡(jiǎn)單的上位機(jī)

    QT | 編寫(xiě)個(gè)簡(jiǎn)單的上位機(jī) 時(shí)間 :2023-03-19文章目錄QT | 編寫(xiě)個(gè)簡(jiǎn)單的上位
    發(fā)表于 05-08 10:12 ?3次下載
    QT|編寫(xiě)<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>簡(jiǎn)單</b>的上位機(jī)

    如何用BUCK電路簡(jiǎn)單實(shí)現(xiàn)個(gè)可靠的負(fù)電源?

    如何用BUCK電路簡(jiǎn)單實(shí)現(xiàn)個(gè)可靠的負(fù)電源?
    的頭像 發(fā)表于 12-05 15:12 ?675次閱讀
    如何用BUCK電路<b class='flag-5'>簡(jiǎn)單</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>可靠的負(fù)電源?

    個(gè)簡(jiǎn)單的分頻器電路分享

    這是個(gè)簡(jiǎn)單的分頻器電路,該電路的優(yōu)點(diǎn)是電路小,它僅使用晶體管和其他幾個(gè)組件
    的頭像 發(fā)表于 06-10 15:55 ?787次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>簡(jiǎn)單</b>的分頻器電路分享