QT中QTableView+Model+Delegate實現一個demo

一、概述

功能:?實現一個查詢學生信息的表格,有學號、性別、年齡、班級和分數共5列,針對最后一列分數實現委托代理,要求能編輯和查看該分數列。

QTableView實現視圖展示ui

Model負責數據的構造

Delegate是委托,可針對某列數據做自定義擴展

使用的qt控件如下:

  • QTableView
  • StudentTableModel繼承自QAbstractTableModel
  • ScoreDelegate繼承自QStyledItemDelegate

二、具體代碼

studenttablemodel.h

#ifndef STUDENTTABLEMODEL_H
#define STUDENTTABLEMODEL_H#include <QAbstractTableModel>
#include <QObject>class StudentTableModel : public QAbstractTableModel
{Q_OBJECT
public:explicit StudentTableModel(QObject *parent = nullptr);int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;QVariant headerData(int section, Qt::Orientation orientation,int role = Qt::DisplayRole) const override;bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;Qt::ItemFlags flags(const QModelIndex &index) const override;private:QVector<QVector<QVariant>> m_data; // 數據存儲
};#endif // STUDENTTABLEMODEL_H

studenttablemodel.cpp

#include "studenttablemodel.h"StudentTableModel::StudentTableModel(QObject *parent): QAbstractTableModel{parent}
{// 初始化示例數據m_data = {{"1001", "male", 18, "class_01", 85},{"1002", "female", 19, "class_02", 92},{"1003", "male", 20, "class_03", 78}};
}int StudentTableModel::rowCount(const QModelIndex &parent) const
{Q_UNUSED(parent);return m_data.size();
}int StudentTableModel::columnCount(const QModelIndex &parent) const
{Q_UNUSED(parent);return 5; // 學號、性別、年齡、班級、分數
}QVariant StudentTableModel::data(const QModelIndex &index, int role) const
{if(!index.isValid()) return QVariant();if (role == Qt::DisplayRole || role == Qt::EditRole) {return m_data[index.row()][index.column()];}return QVariant();
}QVariant StudentTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {switch (section) {case 0: return "id";case 1: return "sex";case 2: return "age";case 3: return "class";case 4: return "score";}}return QVariant();
}bool StudentTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if (role == Qt::EditRole && index.isValid()) {m_data[index.row()][index.column()] = value;emit dataChanged(index, index); // 通知視圖更新return true;}return false;
}Qt::ItemFlags StudentTableModel::flags(const QModelIndex &index) const
{auto flags = QAbstractTableModel::flags(index);if (index.column() == 4) // 分數列可編輯flags |= Qt::ItemIsEditable;return flags;
}

scoredelegate.h

#ifndef SCOREDELEGATE_H
#define SCOREDELEGATE_H#include <QObject>
#include <QStyledItemDelegate>class ScoreDelegate : public QStyledItemDelegate
{Q_OBJECT
public:explicit ScoreDelegate(QObject *parent = nullptr);QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const override;void setEditorData(QWidget *editor, const QModelIndex &index) const override;void setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const override;
};#endif // SCOREDELEGATE_H
#include "scoredelegate.h"#include <QSpinBox>ScoreDelegate::ScoreDelegate(QObject *parent): QStyledItemDelegate{parent}
{}QWidget *ScoreDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if (index.column() == 4) { // 僅對分數列生效QSpinBox *editor = new QSpinBox(parent);editor->setRange(0, 100);editor->setFrame(false);return editor;}return QStyledItemDelegate::createEditor(parent, option, index);
}void ScoreDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{if (index.column() == 4) {int value = index.model()->data(index, Qt::EditRole).toInt();QSpinBox *spinBox = qobject_cast<QSpinBox*>(editor);spinBox->setValue(value);} else {QStyledItemDelegate::setEditorData(editor, index);}
}void ScoreDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{if (index.column() == 4) {QSpinBox *spinBox = qobject_cast<QSpinBox*>(editor);spinBox->interpretText();model->setData(index, spinBox->value());} else {QStyledItemDelegate::setModelData(editor, model, index);}
}

widget.cpp

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);model = new StudentTableModel(this);scoreDelegate = new ScoreDelegate(this);ui->tableView->setModel(this->model);ui->tableView->setItemDelegateForColumn(4, scoreDelegate);// 表格樣式設置ui->tableView->verticalHeader()->hide();ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);//手動設置show顯示ui->tableView->show();
}

三、遇到問題總結

1、QTableView展示不出來,model+tableview為局部變量

?當構造函數執行結束時,這兩個對象會被自動銷毀。即使調用了?tableView.show(),窗口會短暫顯示,但對象銷毀后視圖也隨之消失,因此實際看不到表格

? ? 解決方案?:
將?tableView?和?model??提升為類的成員變量,確保其生命周期與窗口一致:

2、??視圖未嵌入父窗口布局

問題分析?:

  • 即使解決了生命周期問題,若?tableView?未添加到窗口布局中,它可能因尺寸為0或位置錯誤而不可見。
  • 你的代碼中?tableView?是獨立創建的,未關聯到?ui?生成的界面布局中。

?解決方案?:
將?tableView?添加到窗口的布局管理器中(例如使用?QVBoxLayout):

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

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

相關文章

用latex+vscode寫論文

文章目錄 前言 一、下載texlive安裝包 二、安裝texlive 1.安裝 2.配置環境變量 3.檢查是否安裝成功 三、安裝vscode 四、vscode中安裝latex workshop插件 五、創建latex文檔 六、撰寫+編譯+預覽 七、latex workshop常用設置 1.打開設置頁面 2.設置自動保存代碼 3.設置自動編譯代…

監測預警系統:讓園區更高效、更安全、更智能

隨著城市化進程的加快和產業集聚效應的凸顯&#xff0c;園區作為經濟發展的重要載體&#xff0c;其規模不斷擴大&#xff0c;功能日益復雜。在這一背景下&#xff0c;傳統的園區管理模式已難以滿足現代園區高效、安全、智能的運營需求。園區監測預警系統作為一種集成了物聯網、…

分享一個AutoOff定時動作軟件

我們平時在使用電腦的時候有很多需求的功能&#xff0c;比如定時打開程序、定時關閉程序、定時休眠、定時關機等等。如果你也有這樣的需求&#xff0c;那么就需要今天這款軟件。AutoOff定時動作軟件AutoOff這個軟件是一款定時的軟件&#xff0c;軟件大小只有1.1M&#xff0c;而…

RPA軟件推薦:提升企業自動化效率

在數字化轉型浪潮中&#xff0c;機器人流程自動化&#xff08;RPA&#xff09;已成為企業降本增效的核心工具。它通過模擬人類操作&#xff0c;自動化重復性任務&#xff0c;如數據錄入、報表生成和系統集成&#xff0c;顯著提升運營效率。面對眾多RPA軟件&#xff0c;如何選擇…

【Qt】QTime::toString(“hh:mm:ss.zzz“) 顯示亂碼的原因與解決方案

在使用 Qt 編寫計時器程序時&#xff0c;我遇到一個很奇怪的問題&#xff1a;使用 QTime::toString("hh:mm:ss.zzz") 格式化時間后&#xff0c;顯示出來的是一串亂碼&#xff0c;如下所示&#xff1a;本來應該是&#xff1a;但卻顯示了一堆“〇”或奇怪的符號。問題表…

MSVC編譯KDChart過程

MSVC編譯KDChart過程 一、下載KDChart源文件 GitHub源文件 查看文件夾里的INSTALL.txt&#xff0c;可以看到需要CMake編譯。 中文版 以下是使用 CMake 構建系統安裝 KD Chart 的說明。 需要 CMake 3.3 或更高版本。Qt 版本支持&#xff1a;* KD Chart 2.5.0 及以下版本需要…

AI Agent管理后臺原型設計全拆解(附3套可復用素材)

最近在做AI方向的產品&#xff0c;越來越能感受到“智能體”這個概念正在從技術圈走向應用層。無論是內部探索項目&#xff0c;還是外部合作需求&#xff0c;很多場景都會提到Agent、助手、知識庫這些關鍵詞。我們經常討論如何打造一個有用的AI Agent&#xff0c;但實際上&…

ABP VNext + Elastic APM:微服務性能監控

ABP VNext Elastic APM&#xff1a;微服務性能監控 &#x1f680; &#x1f4da;目錄ABP VNext Elastic APM&#xff1a;微服務性能監控 &#x1f680;一、引言 ?架構全景圖 &#x1f3d7;?二、環境與依賴 &#x1f4e6;三、APM 服務器與 Kibana 快速部署 &#x1f433;Doc…

單片機學習筆記.AD/DA(略含有SPI,用的是普中開發板上的XPT2046芯片)

AD/DA基礎知識 硬件電路&#xff1a; 模電運放知識回顧&#xff1a; 虛短&#xff08;Virtual Short&#xff09;定義&#xff1a;運放同相輸入端&#xff08;&#xff09;和反相輸入端&#xff08;-&#xff09;的電位近似相等&#xff0c;即V V-&#xff0c;仿佛兩個輸入端短…

避坑指南:VMware安裝CentOS常見錯誤及完美解決方案

1. 引言 虛擬機允許在同一臺機子上有不同的操作系統&#xff0c;還可以用于搭建實驗環境、軟件測試和兼容性測試等。我是主攻大數據方向的會用到Linux操作系統&#xff0c;所以虛擬機對我來說是很有必要的。我把之前的筆記和安裝包整理了一下&#xff0c;就有了現在這個教程。…

Python爬蟲04_Requests豆瓣電影爬取

一、 爬取豆瓣電影排行榜數據 import requests import json url ‘https://movie.douban.com/j/chart/top_list’ param { ‘type’:‘24’, ‘interval_id’:‘100:90’, ‘action’:‘’, ‘start’:‘0’, #從庫中的第幾部電影去取 ‘limit’:‘20’, } headers { ‘Use…

工業物聯網模塊運營指南?

一、運營目標 工業物聯網模塊運營的核心目標在于通過高效運作,實現提高工業設備運行效率、降低生產成本、推動生產過程智能化管理,進而提升企業的整體競爭力。這一目標是后續所有運營工作的出發點和落腳點,為各項運營環節提供方向指引。 二、關鍵運營環節及做法 (一)設…

9.項目起步(3)

1項目起步-靜態資源初始化 和 Error Lens 安裝圖片資源和樣式資源error lens 安裝2項目起步-scss文件自動導入為什么要自動導入自動導入配置scss變量自動導入$xtxColor: #27ba9b; $helpColor: #e26237; $sucColor: #1dc779; $warnColor: #ffb302; $priceColor: #cf4444;css: {p…

MCP提示詞工程:上下文注入的藝術與科學

MCP提示詞工程&#xff1a;上下文注入的藝術與科學 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我放飛的蝴蝶…

字節跳動GR-3:可泛化、支持長序列復雜操作任務的機器人操作大模型(技術報告解讀)

1.總結 GR-3 是一個大規模的視覺 - 語言 - 動作&#xff08;VLA&#xff09;模型。它對新物體、新環境以及含抽象概念的新指令展現出較好的泛化能力。此外&#xff0c;GR-3 支持少量人類軌跡數據的高效微調&#xff0c;可快速且經濟地適應新任務。GR-3 在處理長周期和靈巧性任…

713. 乘積小于 K 的子數組

中等 給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回子數組內所有元素的乘積嚴格小于 k 的連續子數組的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [10,5,2,6], k 100 輸出&#xff1a;8 解釋&#xff1a;8 個乘積小于 100 的子數組分別為&#xff1a;[10…

【算法】 SM2、FSRS、SuperMemo算法實現艾賓浩斯記憶曲線,通過以上算法你也可以開發出單詞記憶軟件

有那些算法可以實現艾賓浩斯單詞記憶 用戶: 有那些算法可以實現艾賓浩斯單詞記憶 元寶: 以下是基于 艾賓浩斯遺忘曲線 的智能記憶算法實現方案&#xff0c;結合 間隔重復算法 與 現代機器學習技術&#xff0c;提供從理論到實踐的完整解決方案&#xff1a; 一、核心算法原理 1. …

SQL167 連續簽到領金幣

SQL167 連續簽到領金幣 題目描述 用戶行為日志表 tb_user_log iduidartical_idin_timeout_timesign_in110102021-07-07 10:00:002021-07-07 10:00:091210102021-07-08 10:00:002021-07-08 10:00:091310102021-07-09 10:00:002021-07-09 10:00:42141010 2021-07-10 10:00:00 …

PHP性能優化與高并發處理:從基礎到高級實踐

引言 在當今高流量的互聯網環境中,PHP應用的性能優化變得至關重要。本文將全面探討PHP性能優化的各個層面,從基礎優化技巧到高級并發處理方案,幫助開發者構建高性能的PHP應用。 基礎性能優化 OPcache配置優化 ; php.ini 推薦OPcache配置 [opcache] opcache.enable=1 opc…

C++ std::map erase() 和迭代器詳解:常見面試陷阱與深入理解

在使用 C 的 std::map 時&#xff0c;配合 erase() 和迭代器的使用是一個經典面試點&#xff0c;也是實際開發中經常出錯的地方。本文將深入講解 erase() 的行為、end() 的本質以及迭代器失效規則&#xff0c;幫助你寫出更健壯的代碼。1. erase(it) 的行為當你使用 erase(it) 刪…