QT中級(2)QTableView自定義委托(二)實現QProgressBar委托

来源:https://www.cnblogs.com/mqinglang/archive/2023/11/01/17803158.html
-Advertisement-
Play Games

同系列文章 QT中級(1)QTableView自定義委托(一)實現QSpinBox、QDoubleSpinBox委托 QT中級(2)QTableView自定義委托(二)實現QProgressBar委托 QT中級(3)QTableView自定義委托(三)實現QCheckBox委托並且將QCheckBo ...


同系列文章

QT中級(1)QTableView自定義委托(一)實現QSpinBox、QDoubleSpinBox委托
QT中級(2)QTableView自定義委托(二)實現QProgressBar委托
QT中級(3)QTableView自定義委托(三)實現QCheckBox委托並且將QCheckBox居中
QT中級(4)QTableView自定義委托(四)實現QDateTimeEdit、QDateEdit控制項
QT高級(1)QTableView自定義委托集合,一個類實現若幹委托

1 寫在前面的話

我們在之前寫的《QT(7)-初識委托》文章末尾提到,“使用一個類繼承QStyledItemDelegate實現常用的控制項委托,在使用時可以直接調用介面,靈活實現各種委托”。我們接下來幾篇文章將先詳細講解各個控制項的委托,最後整理成一個類,並分享源碼。如果大家感興趣,可以點個關註,後面我們一起學習!

講解比較詳細,大家可以跟著一步一步做,自己就可以實現了。

2 需要用到的部分知識

《QT(3)-QTableView》
《QT(4)-QAbstractItemView》
《QT(6)-QStandardItemModel》
《QT(7)-初識委托》

3 同系列文章

QT中級(1)QTableView自定義委托(一)實現QSpinBox、QDoubleSpinBox委托

4 實現QProgressBar委托

進度條一般都是要一直顯示在QTableView上,所以要實現QProgressBar委托,就要重新實現paint函數。

4.1 第一步

文件結構如下:
在這裡插入圖片描述

在設計師界面拖拽一個tableview到MainWindow中,並對其進行初始化。
需要主要的是 void initTable(...);這個函數是我在經常使用QTableView時通用的設置,不僅可以在這個項目使用,也可以在其他項目中使用
在這裡插入圖片描述
代碼如下:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QStandardItemModel;
class QTableView;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void init();
    //設置表格
    void initTable(QTableView *tableView,int rowHeight = 25,bool Editable=false,bool isSorting = false,bool verticalHeadVisible=false,
            bool isLastTensile = true,bool isShowGrid = true);

private:
    Ui::MainWindow *ui;
    QStandardItemModel *model;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QStandardItemModel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->initTable(ui->tableView,27,true);
    this->init();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::init()
{
    QStringList columnNames;
    columnNames<<"QSpinBox"<<"QComboBox"<<"QCheckBox"<<"QProgressBar"<<"···";

    model = new QStandardItemModel;
    model->setRowCount(10);
    model->setHorizontalHeaderLabels(columnNames);
    ui->tableView->setModel(model);

}

void MainWindow::initTable(QTableView *tableView,int rowHeight,bool Editable,bool isSorting,bool verticalHeadVisible,bool isLastTensile,bool isShowGrid)
{
    /*設置樣式*/
    tableView->setProperty("model",true);
    /*設置預設行高*/
    tableView->verticalHeader()->setDefaultSectionSize(rowHeight);
    /*設置交替行顏色--允許交替行顏色*/
    tableView->setAlternatingRowColors(true);
    /*設置水平/垂直滾動模式--一次滾動一個項目*/
    tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);
    tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
    /*設置選擇行為--每次選擇只有一整行*/
    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    /*設置拖放行為--不允許拖放*/
    tableView->setDragDropMode(QAbstractItemView::NoDragDrop);
    /*設置選擇模式--只能選擇一個項目*/
    tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    /*設置Tab導航鍵--允許使用Tab鍵導航,shift+tab反嚮導航*/
    tableView->setTabKeyNavigation(true);
    /*設置是否自動換行--取消自動換行*/
    tableView->setWordWrap(false);
    /*設置文本省略模式--省略號不會出現在文本中*/
    tableView->setTextElideMode(Qt::ElideNone);
    /*設置左上角全選按鈕--禁用*/
    tableView->setCornerButtonEnabled(false);
    /*設置是否支持表頭排序--應該和表頭是否可以單擊保持一致*/
    tableView->setSortingEnabled(isSorting);
    /*設置是否顯示網格線*/
    tableView->setShowGrid(isShowGrid);
    /*設置垂直表頭是否可見*/
    tableView->verticalHeader()->setVisible(verticalHeadVisible);
    /*設置選中一行表頭是否加粗--不加粗*/
    tableView->horizontalHeader()->setHighlightSections(false);
    /*設置最後一行是否拉伸填充*/
    tableView->horizontalHeader()->setStretchLastSection(isLastTensile);
    /*設置行標題最小寬度尺寸*/
    tableView->horizontalHeader()->setMinimumSectionSize(0);
    /*設置行標題最小高度*/
    tableView->horizontalHeader()->setFixedHeight(rowHeight);

    /*設置表頭是否可以單擊--不可單擊*/
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    tableView->horizontalHeader()->setSectionsClickable(isSorting);
#else
    tableView->horizontalHeader()->setClickable(false);
#endif

    /*是否可編輯*/
    if(Editable)
    {
        tableView->setEditTriggers(QAbstractItemView::CurrentChanged|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed);
    }
    else
    {
        tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }
}

4.2 第二步

  1. 我們首先創建一個類Delegate繼承QStyledItemDelegate,同時定義paint函數
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

這四個函數的作用以及意義,詳見:《QT(7)-初識委托》這裡不在贅述。

  1. 創建一些 QSpinBox相關參數,並創建相應參數的外部設置介面
    /*QProgressBar設置相關參數函數*/
    void setPgBarRange(const int min,const int max);
    void setPgBarTextVisible(bool isTextVisible);
    void setPgBarAlignment(Qt::Alignment pgbarAlignment);
    void setInvertedAppearance(bool invertedAppearance);

    /*QProgressBar相關參數*/
    int pgbarMax;
    int pgbarMin;
    Qt::Alignment pgbarAlignment;
    bool isTextVisible;
    bool invertedAppearance;
    QProgressBar *pgBar;

這裡我定義了很多參數,實際應用的時候有些參數並用不到,大家根據需求定義。

  1. 創建給這些參數初始化的函init()
void Delegate::init()
{
    pgBar = new QProgressBar;
    pgbarMax = 100;
    pgbarMin = 0;
    pgbarAlignment = Qt::AlignCenter;
    isTextVisible = true;
    invertedAppearance = false;
}

4.3 第三步

下麵我們逐個實現paint函數

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

    if(index.column() == 3)
    {
        //獲得視圖中的值
        int value = index.model()->data(index,Qt::DisplayRole).toInt();
        //創建包含QProgressBar樣式信息類
        QStyleOptionProgressBar soPgbar;
        //使用我們創建的pgBar初始化soPgbar
        soPgbar.initFrom(pgBar);
        //設置最大值和最小值
        soPgbar.maximum = pgbarMax;
        soPgbar.minimum = pgbarMin;
        //設置進度條值
        soPgbar.progress = value;
        //設置狀態
        soPgbar.state |= QStyle::State_Enabled;
        soPgbar.state |= QStyle::State_Horizontal;
        //設置位置和大小
        soPgbar.rect = option.rect;
        //設置文本
        soPgbar.text = QString("%1%").arg(value);
        //設置文本是否可見
        soPgbar.textVisible = isTextVisible;
        //設置文本居中
        soPgbar.textAlignment = pgbarAlignment;
        //設置進度條的進度方向
        soPgbar.invertedAppearance = invertedAppearance;
        //繪製
        QApplication::style()->drawControl(QStyle::CE_ProgressBar,&soPgbar,painter,pgBar);
    }//if
    else
    {
        QStyledItemDelegate::paint(painter,option,index);
    }
}

4.4 最後一步

我們需要在mainwindow.cpp中的init()調用delegate類實現委托。我們將QTableView的第一列設置為委托:

更新mainwindow.cpp中的init()函數

void MainWindow::init()
{
    QStringList columnNames;
    columnNames<<"QSpinBox"<<"QComboBox"<<"QCheckBox"<<"QProgressBar"<<"···";

    model = new QStandardItemModel;
    model->setRowCount(10);
    model->setHorizontalHeaderLabels(columnNames);
    ui->tableView->setModel(model);

    Delegate *pgbarDelegate = new Delegate;
    ui->tableView->setItemDelegateForColumn(3,pgbarDelegate);
}

4.5 運行效果

在這裡插入圖片描述

5 源碼

源碼

都看到這裡了,賞個關註吧!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 基礎介紹 ThreadPoolExecutor是Python標準庫concurrent.futures模塊中的一個類,用於實現線程池的功能。 ThreadPoolExecutor模塊相比於threading等模塊,通過submit方法返回的是一個Future對象,它代表了一個未來可期的結果。通 ...
  • 一、寫在前面 使用過chatGPT的同學,可能都會有過這樣的經歷?遇到代碼不會的問題,本能的就會去求助chatGPT,然後並根據chatGPT的回答去優化代碼。但是,沒了梯子的話,chatGPT是不是也幫不上忙了?還是只有我是這樣的情況 ̄□ ̄|| 當然,這也讓我偶然發現這個插件,對於我這種代碼渣渣來 ...
  • 寫來寫去,發現還是寫博客比較隨意,不用考慮那麼的邏輯和語法什麼的,比寫SCI要舒服多了。言歸正傳,這一次我主要做了一個遙感影像生產線,如何理解呢? 它主要就是用來將原始的L1產品,自動處理融合影像,也就是常說的正射影像或者DOM影像,而且支持底圖配準與勻光勻色處理,使用非常方便,支持大批量數據全 自 ...
  • JSON 是一種用於存儲和交換數據的語法。JSON 是文本,使用 JavaScript 對象表示法編寫。 Python 中的 JSON Python 有一個內置的 json 包,可用於處理 JSON 數據。 示例:導入 json 模塊: import json 解析 JSON - 從 JSON 轉換 ...
  • 創建名為spring_mvc_ajax的新module,過程參考9.1節和9.5節 10.1、SpringMVC處理Ajax請求 10.1.1、頁面請求示例 <input type="button" value="測試SpringMVC處理Ajax請求" onclick="testAjax()"> ...
  • 一、 前言 ​ 最近在看tomcat connector組件的相關源碼,對Nio2的非同步回調過程頗有興趣,平時讀源碼不讀,自己讀的時候很多流程都沒搞明白,去查網上相關解析講的給我感覺也不是特別清晰,於是就自己慢慢看源碼,以下是我自己的見解,因為開發經驗也不多,剛成為社畜不久,有些地方講錯如果有大佬看 ...
  • 在如今這個信息爆炸的時代,短視頻成為了一種非常受歡迎的娛樂方式。而在短視頻中,各種搞笑的內容更是大受歡迎。因此,開發一個能夠讓人們笑翻天的笑話短視頻介面就成為了一個非常有趣的項目。本文將介紹如何使用挖數據平臺的API來開發一個簡單的笑話短視頻介面,並提供代碼說明。 API介紹 挖數據平臺提供了一個非 ...
  • 中斷系統:是執行和管理中斷的邏輯結構 外部中斷:是眾多能產生中斷的外設之一 中斷:指的是中斷源(中斷通道),中斷產生CPU暫停正在執行程式,去執行中斷程式,然後返回。提高效率 F1系列的STM32有68個中斷源,不同系列需要看手冊 EXTI(外部中斷)、TIM、ADC、USART、SPI、I2C、R ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...