QTableView 和 QAbstractTableModel

1.自定義類繼承QAbstractTableModel

頭文件如下:

#ifndef TESTMOUDLE_H
#define TESTMOUDLE_H
#include "StructTest.h"
#include <QAbstractTableModel>
 
class TestMoudle : public QAbstractTableModel
{
public:
    TestMoudle(QStringList& list, QObject *parent = nullptr);
    ~TestMoudle();
    void AddData(StructTest test);
    void DelData(int index );
public:
    virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
public:
    QList<StructTest> m_list;
    QStringList m_headList;
};
#endif // TESTMOUDLE_H

源文件

#include "TestMoudle.h"
 
 
TestMoudle::TestMoudle(QStringList& list, QObject *parent )
    : QAbstractTableModel(parent), m_headList(list)
{
}
 
TestMoudle::~TestMoudle()
{
 
}
 
 
Qt::ItemFlags TestMoudle::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    return flags|Qt::ItemIsEditable; //需要雙擊編輯 添加 Qt::ItemIsEditable
}
int TestMoudle::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)
    return m_list.size();
}
int TestMoudle::columnCount(const QModelIndex &parent ) const
{
    Q_UNUSED(parent)
    return 2;
}
 
bool TestMoudle::setData(const QModelIndex &index, const QVariant &value, int role )
{
    if (!index.isValid())
        return false;
 
    if(role == Qt::EditRole)
    {
        int iRow = index.row(), iCol = index.column();
        if( iRow >= 0 && iRow < m_list.size() )
        {
            if(iCol == 0)
            {
                m_list[iRow].ID = value.toString();
            }
            else if(iCol == 1)
            {
                m_list[iRow].name = value.toString();
            }
        }
    }
 
    return true;
}
 
QVariant TestMoudle::data(const QModelIndex &index, int role ) const
{
    if (!index.isValid())
    {
        return QVariant();
    }
    switch (role)
    {
        case Qt::DisplayRole:
        case Qt::EditRole://不添加 雙擊編輯 原來的內容為空了
        {
            int row = index.row();
            if(row < 0 || row > m_list.size() )
                return QVariant();
            if(index.column()==0)
                return m_list[row].ID;
            else
                return m_list[row].name;
        }
        break;
        case Qt::TextAlignmentRole:
        {
            return QVariant(Qt::AlignCenter);
        }
        break;
        default:
            return QVariant();
    }
    return QVariant();
}
 
QVariant TestMoudle::headerData(int section, Qt::Orientation orientation, int role ) const
{
    if (role==Qt::TextAlignmentRole)
    {
        return QVariant(Qt::AlignCenter);
        if (section==0)
        {
            return QVariant(Qt::AlignCenter);
        }
        else
        {
            return QVariant(Qt::AlignVCenter|Qt::AlignLeft);
        }
    }
    else if (role==Qt::DisplayRole)
    {
        if( orientation==Qt::Horizontal )
        {
            if(  section>=0 && section < m_headList.size() )
                return m_headList.at(section);
        }
        else
           return  QString("%1").arg(section + 1);
    }
    return QAbstractTableModel::headerData(section,orientation,role);
}
 
 
void TestMoudle::AddData(StructTest test)
{
    beginResetModel();
    m_list << test;
    endResetModel();
}
 
void TestMoudle::DelData(int index )
{
    beginResetModel();
    m_list.removeAt(index);
    endResetModel();
}
//mainwidow.cpp
bool InitTableWidget( QTableView *pTableView, QStringList& list, bool bStretch, QList<int>& width, bool bVStretch, int hight)
{
    if( !bStretch && list.size() != width.size() )
        return false;
 
    pTableView->horizontalHeader()->setMinimumSectionSize(1);
 
    if( bStretch )
    {
        pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//寬度自適應
        //pTableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    }
    else
    {
        for (int i=0;i< width.size();i++ ) {
            pTableView->setColumnWidth(i, width.at(i));
        }
    }
    pTableView->horizontalHeader()->setDefaultAlignment (Qt::AlignLeft | Qt::AlignVCenter);
    pTableView->setAlternatingRowColors(true);/* 行顏色交替顯示 */
    if(bVStretch)
        pTableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    else
        pTableView->verticalHeader()->setDefaultSectionSize(hight);
    pTableView->setSelectionBehavior ( QAbstractItemView::SelectItems);
    //pTableView->setEditTriggers(QAbstractItemView::DoubleClicked);
    pTableView->verticalHeader()->setHidden( true );
    pTableView->setShowGrid(true);
    pTableView->setFocusPolicy(Qt::NoFocus);//隱藏選中虛線
    pTableView->horizontalHeader()->setHighlightSections(true);
    pTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    return true;
}
 
 
void MainWindow::InitTable()
{
    QList<int> width;
    QStringList list;
    list << "ID" << "Name";
    m_pMoude = new TestMoudle(list);
    ui->tableView->setModel(m_pMoude);
    QAbstractItemView::EditTriggers xx = ui->tableView->editTriggers();
    InitTableWidget( ui->tableView, list, true,  width, false, 30);
    //ui->tableView->setEditTriggers(QAbstractItemView::CurrentChanged);
    //ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);
   // connect(ui->tableView, &QTableView::doubleClicked, this, &MainWindow::slotRowDoubleClicked);
}
 
//添加
void MainWindow::on_pushButton_clicked()
{
    int row = m_pMoude->rowCount();
    StructTest test;
    test.ID = QString("ID %1").arg(row+1);
    test.name = QString("name %1").arg(row+1);
    m_pMoude->AddData(test);
}
 
 
//刪除
void MainWindow::on_pushButton_2_clicked()
{
    QModelIndex index = ui->tableView->selectionModel()->currentIndex();
    int currentRow = index.row();
    if( currentRow < 0)
    {
        return;
    }
    m_pMoude->DelData(currentRow);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160130.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何一次性解壓多個文件

第一步&#xff1a;多選壓縮包 第二步&#xff1a;右鍵解壓即可 一句話&#xff0c;單個怎么解壓&#xff0c;多個就怎么解壓&#xff0c;只不過先選中 參考&#xff1a;如何一次性解壓多個文件

智能安全帽作業記錄儀賦能智慧工地人臉識別勞務實名制

需求背景 建筑工地是一個安全事故多發的場所。目前&#xff0c;工程建設規模不斷擴大&#xff0c;工藝流程紛繁復雜&#xff0c;如何完善現場施工現場管理&#xff0c;控制事故發生頻率&#xff0c;保障文明施工一直是施工企業、政府管理部門關注的焦點。尤其隨著社會的不斷進…

YARN,ZOOKEERPER--學習筆記

1&#xff0c;YARN組件 1.1YARN簡介 YARN表示分布式資源調度&#xff0c;簡單地說&#xff0c;就是&#xff1a;以分布式技術完成資源的合理分配&#xff0c;讓MapReduce能高效完成計算任務。 YARN是Hadoop核心組件之一&#xff0c;用于提供分布式資源調度服務。 而在Hadoop …

邏輯漏洞(業務邏輯)dami CMS

邏輯漏洞&#xff08;業務支付邏輯漏洞&#xff09;dami CMS 0x01 業務邏輯簡介 業務邏輯指的是一個系統或應用程序中的實際業務規則和流程。它描述了如何處理特定的業務需求、數據和操作。業務邏輯通常是根據特定行業或組織的需求而設計的。 在軟件開發中&#xff0c;業務邏…

零編程基礎Python的全面學習指南

文章目錄 前言什么是編程&#xff1f;Python代碼對應的機器碼準備開始Windows變量類型整型字符串型布爾類型字符串連接和整數相加if 語句捕獲用戶輸入導入MacWindows游戲時間&#xff01;小結關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Pyt…

磐舟CI使用說明及案例

整體介紹 磐舟作為一個devops產品&#xff0c;它具備基礎的CI流水線功能。同時磐舟的流水線是完全基于云原生架構設計的&#xff0c;在使用時會有一些注意事項。這里首先我們要了解磐舟整體的流水線打包邏輯。 文檔結構說明 一般來說&#xff0c;磐舟推薦單個業務的標準git庫…

反編譯-ApkTool

ApkTool下載地址&#xff1a; Apktool | ApktoolA tool for reverse engineering Android apk fileshttps://apktool.org/ 1、使用 apktool 解包 執行 java -jar apktool_2.4.1.jar d demo.apk -o demo 命令 java -jar apktool_2.4.1.jar d demo.apk -o demo 其中 d 后面是…

Nevron Vision for .NET 2023.1 Crack

Nevron Vision for .NET 適用于桌面和 Web 應用程序的高級數據可視化 Nevron Vision for .NET提供最全面的組件&#xff0c;用于構建面向 Web 和桌面的企業級數據可視化應用程序。 該套件中的組件具有連貫的 2D 和 3D 數據可視化效果&#xff0c;對觀眾產生巨大的視覺沖擊力。我…

基于window10的遠程桌面報錯:要求的函數不受支持 的問題解決方法

基于window10的遠程桌面報錯&#xff1a;要求的函數不受支持 的問題解決方法 設置方法&#xff1a; 一、WINR 在框內輸入gpedit.msc 二、依次打開 計算機配置----管理模板-----系統—憑據分配—加密數據庫修正–改為以啟用—易受攻擊 第一步&#xff1a; 第二步&#xff1a;…

并查集總結

并查集簡介 并查集是一種可以動態維護若干個不重疊的結合&#xff0c;并支持合并與查詢的數據結構 并查集是一種樹狀的數據結構&#xff0c;可以用于維護傳遞關系以及聯通性。 并查集有兩種操作&#xff1a; find&#xff1a;查詢一個元素屬于哪個集合merge:合并兩個集合 模…

爆款文章有訣竅,內容創作者如何能持續產出優質內容

內容營銷人有沒有這么一種共鳴&#xff1a;10 萬 那么多&#xff0c;為什么不能多我一個&#xff1f; 通常&#xff0c;我們把瀏覽量 / 閱讀量高、轉評贊數量高的內容看作爆款&#xff0c;而數據如果達到 10 萬 則是超級爆款。因為&#xff0c;閱讀量高意味著內容得到了大量的曝…

【Linux】使用Makefile自動化編譯項目:簡化開發流程、提高效率

文章目錄 示例一&#xff1a;編譯一個進度條程序示例二&#xff1a;編譯一個簡單的程序gcc的幾個選項結論 當你開始一個新的軟件項目時&#xff0c;編寫一個好的Makefile是非常重要的。Makefile是一個文本文件&#xff0c;用于指定如何構建和編譯項目。它定義了目標文件、依賴關…

8年老鳥整理,自動化測試-準備測試數據詳細...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 大部分類型的測試…

基于C#實現Bitmap算法

在所有具有性能優化的數據結構中&#xff0c;我想大家使用最多的就是 hash 表&#xff0c;是的&#xff0c;在具有定位查找上具有 O(1)的常量時間&#xff0c;多么的簡潔優美&#xff0c;但是在特定的場合下&#xff1a; ①&#xff1a;對 10 億個不重復的整數進行排序。 ②&am…

python獲取透明圖

import cv2 import os import numpy as nproot "./test" for file in os.listdir(root):# 讀取圖片image cv2.imread(os.path.join(root, file), cv2.IMREAD_UNCHANGED)new np.zeros((image.shape[0], image.shape[1], image.shape[2]), np.uint8)# 檢查圖片是否為…

AI原生應用為百度帶來新增量

我是盧松松&#xff0c;點點上面的頭像&#xff0c;歡迎關注我哦&#xff01; AI將徹底改變每一個行業!得益于AI和基礎模型的驅動&#xff0c;百度在AI原生應用領域厚積薄發。 11月21日&#xff0c;百度Q3財報發布&#xff0c;數據顯示&#xff1a;三季度營收達344.47億元&…

Redis篇---第九篇

系列文章目錄 文章目錄 系列文章目錄前言一、如果有大量的 key 需要設置同一時間過期,一般需要注意什么?二、什么情況下可能會導致 Redis 阻塞?三、緩存和數據庫誰先更新呢?前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊…

Axios簡單使用與配置安裝-Vue

安裝Axios npm i axios main.js 導入 import Axios from axios Vue.prototype.$axios Axios簡單發送請求 get getTest() {this.$axios({method: GET,url: https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/}).then(res > {//請求成功回調console.log(res)}…

uiautomator2快速入門app自動化測試教程

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、環境準備1.安裝軟件2.安裝庫 二、adb 連接手機1. 準備工作2. 第一種連接方式&#xff1a;USB連接3. 第二種連接方式&#xff1a;WLAN連接4. 第三種連接方式…