網(wǎng)站首頁 編程語言 正文
TableDelegate 自定義代理組件的主要作用是對原有表格進(jìn)行調(diào)整,例如默認(rèn)情況下Table中的缺省代理就是一個編輯框,我們只能夠在編輯框內(nèi)輸入數(shù)據(jù),而有時我們想選擇數(shù)據(jù)而不是輸入,此時就需要重寫編輯框?qū)崿F(xiàn)選擇的效果,代理組件常用于個性化定制Table表格中的字段類型。
在自定義代理中QAbstractItemDelegate是所有代理類的抽象基類,我們繼承任何組件時都必須要包括如下4個函數(shù):
- CreateEditor() 用于創(chuàng)建編輯模型數(shù)據(jù)的組件,例如(QSpinBox組件)
- SetEditorData() 從數(shù)據(jù)模型獲取數(shù)據(jù),以供Widget組件進(jìn)行編輯
- SetModelData() 將Widget組件上的數(shù)據(jù)更新到數(shù)據(jù)模型
- UpdateEditorGeometry() 給Widget組件設(shè)置一個合適的大小
此處我們分別重寫三個代理接口,其中兩個ComBox
組件用于選擇婚否,SpinBox
組件用于調(diào)節(jié)數(shù)值范圍,先來定義三個重寫部件。
重寫接口spindelegate.cpp代碼如下.
#include "spindelegate.h" #include <QSpinBox> QWIntSpinDelegate::QWIntSpinDelegate(QObject *parent):QStyledItemDelegate(parent) { } // https://www.cnblogs.com/lyshark QWidget *QWIntSpinDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option, const QModelIndex &index) const { //創(chuàng)建代理編輯組件 Q_UNUSED(option); Q_UNUSED(index); QSpinBox *editor = new QSpinBox(parent); //創(chuàng)建一個QSpinBox editor->setFrame(false); //設(shè)置為無邊框 editor->setMinimum(0); editor->setMaximum(10000); return editor; //返回此編輯器 } void QWIntSpinDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const { //從數(shù)據(jù)模型獲取數(shù)據(jù),顯示到代理組件中 //獲取數(shù)據(jù)模型的模型索引指向的單元的數(shù)據(jù) int value = index.model()->data(index, Qt::EditRole).toInt(); QSpinBox *spinBox = static_cast<QSpinBox*>(editor); //強(qiáng)制類型轉(zhuǎn)換 spinBox->setValue(value); //設(shè)置編輯器的數(shù)值 } void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { //將代理組件的數(shù)據(jù),保存到數(shù)據(jù)模型中 QSpinBox *spinBox = static_cast<QSpinBox*>(editor); //強(qiáng)制類型轉(zhuǎn)換 spinBox->interpretText(); //解釋數(shù)據(jù),如果數(shù)據(jù)被修改后,就觸發(fā)信號 int value = spinBox->value(); //獲取spinBox的值 model->setData(index, value, Qt::EditRole); //更新到數(shù)據(jù)模型 } void QWIntSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { //設(shè)置組件大小 Q_UNUSED(index); editor->setGeometry(option.rect); }
重寫接口floatspindelegate.cpp代碼如下.
#include "floatspindelegate.h" #include <QDoubleSpinBox> QWFloatSpinDelegate::QWFloatSpinDelegate(QObject *parent):QStyledItemDelegate(parent) { } QWidget *QWFloatSpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_UNUSED(option); Q_UNUSED(index); QDoubleSpinBox *editor = new QDoubleSpinBox(parent); editor->setFrame(false); editor->setMinimum(0); editor->setDecimals(2); editor->setMaximum(10000); return editor; } void QWFloatSpinDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { float value = index.model()->data(index, Qt::EditRole).toFloat(); QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor); spinBox->setValue(value); } // https://www.cnblogs.com/lyshark void QWFloatSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor); spinBox->interpretText(); float value = spinBox->value(); QString str=QString::asprintf("%.2f",value); model->setData(index, str, Qt::EditRole); } void QWFloatSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); }
重寫接口comboxdelegate.cpp代碼如下.
#include "comboxdelegate.h" #include <QComboBox> QWComboBoxDelegate::QWComboBoxDelegate(QObject *parent):QItemDelegate(parent) { } QWidget *QWComboBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option, const QModelIndex &index) const { QComboBox *editor = new QComboBox(parent); editor->addItem("已婚"); editor->addItem("未婚"); editor->addItem("單身"); return editor; } // https://www.cnblogs.com/lyshark void QWComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString str = index.model()->data(index, Qt::EditRole).toString(); QComboBox *comboBox = static_cast<QComboBox*>(editor); comboBox->setCurrentText(str); } void QWComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QComboBox *comboBox = static_cast<QComboBox*>(editor); QString str = comboBox->currentText(); model->setData(index, str, Qt::EditRole); } void QWComboBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); }
將部件導(dǎo)入到mainwindow.cpp中,并將其通過ui->tableView->setItemDelegateForColumn(0,&intSpinDelegate);關(guān)聯(lián)部件到指定的table下標(biāo)索引上面。
#include "mainwindow.h" #include "ui_mainwindow.h" // https://www.cnblogs.com/lyshark MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化模型數(shù)據(jù) model = new QStandardItemModel(4,6,this); // 初始化4行,每行六列 selection = new QItemSelectionModel(model); // 關(guān)聯(lián)模型 ui->tableView->setModel(model); ui->tableView->setSelectionModel(selection); // 添加表頭 QStringList HeaderList; HeaderList << "序號" << "姓名" << "年齡" << "性別" << "婚否" << "薪資"; model->setHorizontalHeaderLabels(HeaderList); // 批量添加數(shù)據(jù) QStringList DataList[3]; QStandardItem *Item; DataList[0] << "1001" << "admin" << "24" << "男" << "已婚" << "4235.43"; DataList[1] << "1002" << "lyshark" << "23" << "男" << "未婚" << "10000.21"; DataList[2] << "1003" << "lucy" << "37" << "女" << "單身" << "8900.23"; int Array_Length = DataList->length(); // 獲取每個數(shù)組中元素數(shù) int Array_Count = sizeof(DataList) / sizeof(DataList[0]); // 獲取數(shù)組個數(shù) for(int x=0; x<Array_Count; x++) { for(int y=0; y<Array_Length; y++) { // std::cout << DataList[x][y].toStdString().data() << std::endl; Item = new QStandardItem(DataList[x][y]); model->setItem(x,y,Item); } } // 為各列設(shè)置自定義代理組件 // 0,4,5 代表第幾列 后面的函數(shù)則是使用哪個代理類的意思 ui->tableView->setItemDelegateForColumn(0,&intSpinDelegate); ui->tableView->setItemDelegateForColumn(4,&comboBoxDelegate); ui->tableView->setItemDelegateForColumn(5,&floatSpinDelegate); } MainWindow::~MainWindow() { delete ui; }
代理部件關(guān)聯(lián)后,再次運(yùn)行程序,會發(fā)現(xiàn)原來的TableWidget組件中的編輯框已經(jīng)替換為了選擇框等組件:
原文鏈接:https://www.cnblogs.com/LyShark/p/15628732.html
相關(guān)推薦
- 2022-08-29 Python使用re模塊實現(xiàn)正則表達(dá)式操作指南_python
- 2024-03-10 @Controller、@Service和@Repository注解詳解
- 2022-04-05 easyswoole轉(zhuǎn)發(fā)報錯 writev() failed (104 nginx
- 2022-05-06 C語言中回調(diào)函數(shù)的使用詳情_C 語言
- 2022-09-16 Android?Jetpack架構(gòu)中ViewModel接口暴露的不合理探究_Android
- 2022-08-30 詳解Oracle控制文件及日志文件的管理問題_oracle
- 2023-01-17 Python使用鄰接矩陣實現(xiàn)圖及Dijkstra算法問題_python
- 2023-01-01 C++?Boost?Flyweight庫使用介紹_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支