溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

QT怎么制作一個ListView列表

發(fā)布時間:2023-02-23 18:01:03 來源:億速云 閱讀:201 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“QT怎么制作一個ListView列表”,在日常操作中,相信很多人在QT怎么制作一個ListView列表問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”QT怎么制作一個ListView列表”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    1、概述

    案例:使用Qt制作一個ListView。點擊ListView的Item可以用于測試OpenCV的各種效果

    自定義一個:MainListView繼承QListWidget 、MainListViewItem繼承QListWidgetItem

    2、代碼示例

    1.自定義QListWidget

    mainlistview.h

    class MainListView : public QListWidget
    {
        Q_OBJECT
    public:
        explicit MainListView(QWidget *parent = nullptr);
    protected:
        void mousePressEvent(QMouseEvent *event);
        void mouseReleaseEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void leaveEvent(QEvent *event);
    private:
        QPoint startPoint;
        MainListViewItem *theHighlightItem = nullptr;
        MainListViewItem *oldHighlightItem = nullptr;
        MainListViewItem *theSelectedItem = nullptr;
        MainListViewItem *oldSelectedItem = nullptr;
        Chapter3Option * option = new Chapter3Option();
     
     
    signals:
     
     
    public slots:
        void updateSelectedIcon();
        void onMainItemClick(QListWidgetItem *item);
    };

    mainlistview.cpp

    #include "mainlistview.h"
     
    MainListView::MainListView(QWidget *parent) : QListWidget(parent)
    {
        setMouseTracking(true);
        //連接信號與槽函數(shù),如果選中項發(fā)生變化則觸發(fā)item圖標(biāo)的更新.都是當(dāng)前對象發(fā)生
        connect(this,&MainListView::itemSelectionChanged,this,&MainListView::updateSelectedIcon);
        connect(this,&MainListView::itemClicked,this,&MainListView::onMainItemClick);
    }
     
    /**
     * 處理鼠標(biāo)hove事件,item圖標(biāo)就變成hove狀態(tài)
     * @brief MainListView::mouseMoveEvent
     * @param event
     */
    void MainListView::mouseMoveEvent(QMouseEvent *event){
        oldHighlightItem = theHighlightItem;
        theHighlightItem = static_cast<MainListViewItem *>(itemAt(event->pos()));
        //舊的hover的item圖標(biāo)回復(fù)原狀(條件是該item沒有被選中)
        //新的hover的iten圖標(biāo)變成hover狀態(tài)(條件是該item沒有被選中)
        if(oldHighlightItem != theHighlightItem){
           if(oldHighlightItem && !oldHighlightItem->isSelected()) oldHighlightItem->setIcon(oldHighlightItem->mIcon);
           if(theHighlightItem && !theHighlightItem->isSelected()) theHighlightItem->setIcon(theHighlightItem->mIconHover);
        }
    }
     
    /**
     * 鼠標(biāo)按下(這個可以當(dāng)做item的點擊事件,能夠正常執(zhí)行)
     * @brief MainListView::mousePressEvent
     * @param event
     */
    void MainListView::mousePressEvent(QMouseEvent *event){
        if(event->buttons()&Qt::LeftButton){
            startPoint = event->pos();
            MainListViewItem *item = static_cast<MainListViewItem *>(itemAt(event->pos()));
            QString filePath = QFileDialog::getOpenFileName(this, tr("選擇視頻"), "C:\\Users\\wei.yang\\Downloads\\opencv_res", tr("Image Files(*.jpg *.png)"));
            const char *fileRealPath = filePath.toStdString().c_str();//將QString轉(zhuǎn)換為char*
            qDebug() <<item->text()<<"--->"<<fileRealPath<<"--->pos:"<<item->mPos;
            switch (item->mPos) {
            case 1://顯示原圖
                option->showSrcImage(fileRealPath);
                break;
            case 2://像素取反
                option->pixleReverse(fileRealPath);
                break;
            case 3://圖像融合
                option->imageFuse("","");
                break;
            case 4://調(diào)整圖像亮度及對比度
                option->increaseBrightnessContrastRatio(fileRealPath);
                break;
            case 5://繪制線、矩形、橢圓、圓、多邊形、文本
                option->drawShape();
                break;
            case 6://均值模糊:用于圖像的降噪
                option->showBlur(fileRealPath);
                break;
            case 7://高斯模糊:用于圖像的降噪,其對自然界的噪聲有很好的抑制作用
                option->showGaussianBlue(fileRealPath);
                break;
            case 8://中值濾波:終止濾波用于圖像的降噪,其對椒鹽噪聲有很好的抑制作用(黑白點)
                option->showMediaBlur(fileRealPath);
                break;
            case 9://雙邊濾波:其可以很好的保留邊緣的同時對平坦區(qū)域進行降噪
                option->showBilateralFilter(fileRealPath);
                break;
            case 10://提起圖像中的英文字母
                 option->showCleanImage(fileRealPath);
                break;
            case 11://形態(tài)學(xué)開操作
                option->showImageOpen(fileRealPath);
                break;
            case 12:// 形態(tài)學(xué)閉操作
                option->showImageClose(fileRealPath);
                break;
            case 13://形態(tài)學(xué)梯度(基本梯度):膨脹減去腐蝕
                 option->showMorphologicalGradient(fileRealPath);
                break;
            case 14://頂帽操作:相當(dāng)于原圖像與開操作之間的差值圖像
                 option->showTopHat(fileRealPath);
                break;
            case 15://黑帽操作:相當(dāng)于原圖像與閉操作之間的差值圖像
                 option->showBlackHat(fileRealPath);
                break;
            case 16://小案例:提取提取項目中的字母或者直線
                 option->showLines(fileRealPath,0);
                break;
            case 17://上采樣:利用拉普拉斯金字塔進行圖像重建
                option->showPyrUp(fileRealPath);
                break;
            case 18://降采樣:利用高斯金字塔進行降采樣
                 option->showPyrDown(fileRealPath);
                break;
            case 19://高斯不同:把同一張圖片再不同的參數(shù)下做高斯模糊之后的結(jié)果相減,得到的輸出圖像稱為高斯不同
                option->showGaussianDiff(fileRealPath);
                break;
            case 20://使用自定義卷積核filter2D
                 option->showCustomKernelFilter2D(fileRealPath,1);
                break;
            case 21://1.合并rebort和sobel的x方向梯度和y方向的梯度
                 option->showCustomKernelFilter2DMergeXY(fileRealPath);
                break;
            case 22://填充圖像邊緣
                option->showCopyMakeBorder(fileRealPath);
                break;
            case 23://使用Sobel和Scharr計算圖形梯度
                option->showSobelAndScharr(fileRealPath);
                break;
            case 24://使用拉普拉斯算子顯示梯度圖像
                 option->showLaplacian(fileRealPath);
                break;
            case 25://邊緣檢測
                option->showCanny(fileRealPath);
                break;
            }
        }
    }
     
    /**
     * 釋放鼠標(biāo)
     * @brief MainListView::mouseReleaseEvent
     * @param event
     */
    void MainListView::mouseReleaseEvent(QMouseEvent *event){
        //如果鼠標(biāo)釋放位置和單擊位置相距超過5像素,則不會觸發(fā)item選中
        if((event->pos() - startPoint).manhattanLength() > 5) return;
        MainListViewItem *item = static_cast<MainListViewItem *>(itemAt(event->pos()));
        setCurrentItem(item);
     
    }
    /**
     * 處理鼠標(biāo)離開后,hover圖標(biāo)回復(fù)正常狀態(tài)
     * @brief MainListView::leaveEvent
     * @param event
     */
    void MainListView::leaveEvent(QEvent *event){
        Q_UNUSED(event);
        oldHighlightItem = theHighlightItem;
        if(oldHighlightItem && !oldHighlightItem->isSelected()) oldHighlightItem->setIcon(oldHighlightItem->mIcon);
        oldHighlightItem = theHighlightItem = nullptr;
     
    }
     
    void MainListView::updateSelectedIcon(){
        oldSelectedItem = theSelectedItem;
        theSelectedItem = static_cast<MainListViewItem *>(currentItem());
     
        //之前被選中的item圖標(biāo)回復(fù)原樣
        //新被選中的item圖標(biāo)變成hover狀態(tài)
        if(oldSelectedItem != theSelectedItem){
            if(oldSelectedItem) oldSelectedItem->setIcon(oldSelectedItem->mIcon);
            if(theSelectedItem) theSelectedItem->setIcon(theSelectedItem->mIconHover);
        }
    }
     
     
    //這個槽函數(shù)并沒有執(zhí)行
    void MainListView::onMainItemClick(QListWidgetItem *item){
        qDebug() << "點擊了item的項目";
    }

    2.自定義QListWidgetItem

    mainlistviewitem.h

    class MainListViewItem : public QListWidgetItem
    {
         //Q_OBJECT  //由于QListWidgetItem沒有QObject屬性,所以Q_OBJECT需要注釋掉
    public:
        explicit MainListViewItem(QString itemTitle,const QIcon &icon, const QIcon &iconHover,int pos,QListWidget *parent = nullptr);
        /**
         * 設(shè)置item的圖標(biāo)
         * @brief setItemIcon
         * @param icon
         * @param iconHover
         */
    //    void setItemIcon(const QIcon &icon,const QIcon &iconHover);
    public:
        QIcon mIcon;//默認圖標(biāo)
        QIcon mIconHover;//選中時圖標(biāo)
        int mPos;//第一個編輯
     
    signals:
     
    };

    mainlistviewitem.cpp

    #include "mainlistviewitem.h"
     
    /**
     * 自定義主頁ListView的Item項
     * @brief MainListViewItem::MainListViewItem
     * @param parent
     */
    MainListViewItem::MainListViewItem(QString itemTitle,const QIcon &icon, const QIcon &iconHover,int pos,QListWidget *parent) : QListWidgetItem(parent)
    {
        setText(itemTitle);
        mIcon = icon;
        mIconHover = iconHover;
        setIcon(mIcon);
        setSizeHint(QSize(360,47));
        mPos = pos;
    }

    3.使用

    void MainWindow::createListView(QWidget *parent){
        listView = new MainListView(this);
        listView->setFocusPolicy(Qt::NoFocus);  //這樣可禁用tab鍵和上下方向鍵并且除去復(fù)選框
        listView->setFixedHeight(320);
        listView->setFont(QFont("宋體", 14, QFont::DemiBold));
        listView->setFixedSize(QSize(360,480));
        listView->move(0,menuBar()->height());
        listView->setStyleSheet(
                    "{outline:0px;}"  //除去復(fù)選框
                    "MainListViewItem{background:rgb(245, 245, 247); border:0px; margin:0px 0px 0px 0px;}"
                    "MainListViewItem::Item{height:40px; border:0px; padding-left:14px; color:rgba(200, 40, 40, 255);}"
                    "MainListViewItem::Item:hover{color:rgba(40, 40, 200, 255);}"
                    "MainListViewItem::Item:selected{background:rgb(230, 231, 234); color:rgba(40, 40, 200, 255); border-left:4px solid rgb(180, 0, 0);}"
                    "QListWidget::Item:selected:active{background:rgb(230, 231, 234); color:rgba(40, 40, 200, 255); border-left:4px solid rgb(180, 0, 0);}");
     
        new MainListViewItem("顯示原圖",QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),1,listView);
        new MainListViewItem(tr("像素取反"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),2,listView);
        new MainListViewItem(tr("圖像融合"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),3,listView);
        new MainListViewItem(tr("調(diào)整圖像亮度及對比度"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),4,listView);
        new MainListViewItem(tr("繪制線、矩形、橢圓、圓、多邊形、文本"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),5,listView);
        new MainListViewItem(tr("均值模糊"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),6,listView);
        new MainListViewItem(tr("高斯模糊"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),7,listView);
        new MainListViewItem(tr("中值濾波"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),8,listView);
        new MainListViewItem(tr("雙邊濾波"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),9,listView);
        new MainListViewItem(tr("提取圖像中的英文字母"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),10,listView);
        new MainListViewItem(tr("形態(tài)學(xué)開操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),11,listView);
        new MainListViewItem(tr("形態(tài)學(xué)閉操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),12,listView);
        new MainListViewItem(tr("形態(tài)學(xué)梯度(基本梯度)"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),13,listView);
        new MainListViewItem(tr("頂帽操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),14,listView);
        new MainListViewItem(tr("黑帽操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),15,listView);
        new MainListViewItem(tr("小案例:提取提取項目中的字母或者直線"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),16,listView);
        new MainListViewItem(tr("上采樣"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),17,listView);
        new MainListViewItem(tr("降采樣"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),18,listView);
        new MainListViewItem(tr("高斯不同"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),19,listView);
        new MainListViewItem(tr("使用自定義卷積核filter2D"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),20,listView);
        new MainListViewItem(tr("合并rebort及Sobel的x方向梯度和y方向的梯度"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),21,listView);
        new MainListViewItem(tr("填充圖像邊緣"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),22,listView);
        new MainListViewItem(tr("使用Sobel和Scharr計算圖形梯度"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),23,listView);
        new MainListViewItem(tr("使用拉普拉斯算子顯示梯度圖像"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),24,listView);
        new MainListViewItem(tr("邊緣檢測"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),25,listView);
     
    //    connect(listView,&MainListView::itemClicked,listView,&MainListView::onMainItemClick);
    }
    //最后一步:創(chuàng)建ListView,然后運行就行了
     createListView(this);

    3、圖片演示

    QT怎么制作一個ListView列表

    到此,關(guān)于“QT怎么制作一個ListView列表”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI