1. 程式人生 > >Qt學習: Model/View實現表格和統計圖

Qt學習: Model/View實現表格和統計圖

博主QQ:1356438802

一、簡介

       Model/View結構使資料管理與相應的資料顯示相互獨立,並提供了一系列標準的函式介面和用於Model模組與View模組之間的通訊。它從MVC演化而來,MVC由三種物件組成,Model是應用程式物件,View是它的螢幕表示,Controller定義了使用者介面如何對使用者輸入進行響應。把MVC中的View和Controller合在一起,就形成了Model/View結構。

二、執行圖

(1)為了靈活對使用者的輸入進行處理,引入了Delegate,Model、View、Delegate三個模組之間通過訊號與槽機制實現,當自身的狀態發生改變時會發出訊號通知其他模組。它們間的關係如下圖1所示。

       QAbstractItemModel是所有Model的基類,但一般不直接使用QAbstractItemModel,而是使用它的子類。Model模組本身並不儲存資料,而是為View和Delegate訪問資料提供標準的介面。

       View模組從Model中獲得資料項顯示給使用者,Qt提供了一些常用的View模型,如QTreeView、QTableView和QListView。

       Delegate的基本介面在QAbstractItemDelegate類中定義,通過實現paint()和sizeHint()以達到渲染資料項的目的。

(2)程式執行圖如下圖2所示。


三、詳解

1、表格中嵌入控制元件

利用Delegate的方式實現表格中嵌入各種不同控制元件的效果,控制元件在需要編輯資料項時才出現。

(1)插入日曆編輯框QDateLineEdit

  1. #ifndef DATEDELEGATE_H
  2. #define DATEDELEGATE_H
  3. #include <QtGui>
  4. class DateDelegate : public QItemDelegate  
  5. {  
  6.     Q_OBJECT  
  7. public:  
  8.     DateDelegate(QObject *parent = 0);  
  9.     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,  
  10.                            const QModelIndex &index) const;  
  11.     void setEditorData(QWidget *editor, const QModelIndex &index) const;  
  12.     void setModelData(QWidget *editor, QAbstractItemModel *model,  
  13.                        const QModelIndex &index) const;  
  14.     void updateEditorGeometry(QWidget *editor,  
  15.          const QStyleOptionViewItem &option, const QModelIndex &index) const;  
  16. };  
  17. #endif
  1. #include "datedelegate.h"
  2. DateDelegate::DateDelegate(QObject *parent)  
  3.     : QItemDelegate(parent)  
  4. {  
  5. }  
  6. QWidget *DateDelegate::createEditor(QWidget *parent,  
  7.     const QStyleOptionViewItem &/* option */,  
  8.     const QModelIndex &/* index */const
  9. {  
  10.     QDateTimeEdit *editor = new QDateTimeEdit(parent);  
  11.     editor->setDisplayFormat("yyyy-MM-dd");  
  12.     editor->setCalendarPopup(true);  
  13.     editor->installEventFilter(const_cast<DateDelegate*>(this));  
  14.     return editor;  
  15. }  
  16. void DateDelegate::setEditorData(QWidget *editor,  
  17.                                      const QModelIndex &index) const
  18. {  
  19.     QString dateStr = index.model()->data(index).toString();  
  20.     QDate date = QDate::fromString(dateStr,Qt::ISODate);  
  21.     QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor);  
  22.     edit->setDate(date);  
  23. }  
  24. void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,  
  25.                                     const QModelIndex &index) const
  26. {  
  27.     QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor);  
  28.     QDate date = edit->date();  
  29.     model->setData(index, QVariant(date.toString(Qt::ISODate)));  
  30. }  
  31. void DateDelegate::updateEditorGeometry(QWidget *editor,  
  32.     const QStyleOptionViewItem &option, const QModelIndex &/* index */const
  33. {  
  34.     editor->setGeometry(option.rect);  
  35. }  
       分析:DateDelegate繼承QItemDelegate,一般需要重定義宣告中的幾個虛擬函式。createEditor()函式完成建立控制元件的工作;setEditorDate()設定控制元件顯示的資料,把Model資料更新至Delegate,相當於初始化工作;setModelDate()把Delegate中對資料的更改更新至Model中;updateEditor()更析控制元件區的顯示。

(2)插入下拉列表框QComboBox

  1. #include "combodelegate.h"
  2. ComboDelegate::ComboDelegate(QObject *parent)  
  3.     : QItemDelegate(parent)  
  4. {  
  5. }  
  6. QWidget *ComboDelegate::createEditor(QWidget *parent,  
  7.     const QStyleOptionViewItem &/* option */,  
  8.     const QModelIndex &/* index */const
  9. {  
  10.     QComboBox *editor = new QComboBox(parent);  
  11.     editor->addItem(QString::fromLocal8Bit("工人"));  
  12.     editor->addItem(QString::fromLocal8Bit("農民"));  
  13.     editor->addItem(QString::fromLocal8Bit("醫生"));  
  14.     editor->addItem(QString::fromLocal8Bit("律師"));  
  15.     editor->addItem(QString::fromLocal8Bit("軍人"));  
  16.     editor->installEventFilter(const_cast<ComboDelegate*>(this));  
  17.     return editor;  
  18. }  
  19. void ComboDelegate::setEditorData(QWidget *editor,  
  20.                                      const QModelIndex &index) const
  21. {  
  22.     QString str = index.model()->data(index).toString();  
  23.     QComboBox *box = static_cast<QComboBox*>(editor);  
  24.     int i = box->findText(str);  
  25.     box->setCurrentIndex(i);  
  26. }  
  27. void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,  
  28.                                     const QModelIndex &index) const
  29. {  
  30.     QComboBox *box = static_cast<QComboBox*>(editor);  
  31.     QString str = box->currentText();  
  32.     model->setData(index, str);  
  33. }  
  34. void ComboDelegate::updateEditorGeometry(QWidget *editor,  
  35.     const QStyleOptionViewItem &option, const QModelIndex &/* index */const
  36. {  
  37.     editor->setGeometry(option.rect);  
  38. }  

(3)插入微調器QSpinBox

  1. #include "spindelegate.h"
  2. SpinDelegate::SpinDelegate(QObject *parent)  
  3.     : QItemDelegate(parent)  
  4. {  
  5. }  
  6. QWidget *SpinDelegate::createEditor(QWidget *parent,  
  7.     const QStyleOptionViewItem &/* option */,  
  8.     const QModelIndex &/* index */const
  9. {  
  10.     QSpinBox *editor = new QSpinBox(parent);  
  11. 相關推薦

    Qt學習: Model/View實現表格統計

    博主QQ:1356438802 一、簡介        Model/View結構使資料管理與相應的資料顯示相互獨立,並提供了一系列標準的函式介面和用於Model模組與View模組之間的通訊。它從MVC演化而來,MVC由三種物件組成,Mode

    自定義View實現 android圓形統計及百分比顯示

    兄弟們  廢話不多說,直接上程式碼了: package com.zz.kotlintest.view; import android.content.Context; import android.content.res.Resources; import andr

    Qt學習筆記2:QMainWindowQWidget的區別

    在Qt工程建立時,Qt Widget Application模板下提供了不同的父類繼承。 這裡,主要分析一下QMainWindow和QWidget的區別。 建立工程 分別以QMainWindow和QWidget為基類建立工程,工程建立完成後,如下圖所示: Qt會自動建

    利用CSSjquery 實現圓環統計

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>圓環統計圖</title> <script sr

    (三)微信小程式之容器元件view實現水平縱向佈局

    專案中最常用的兩種佈局方式,水平佈局和垂直佈局,在微信小程式中實現起來也比較簡單。 1.橫向水平佈局: 實現水平佈局,需要四個view容器元件,其中一個是父容器。如下: <!--index.wxml--> <view class="content"&g

    python資料分析pandas包入門學習(三)彙總統計描述

    本文參考《利用Python進行資料分析》的第五章 pandas入門 pandas擁有一組常用的數學和統計方法。它們大部分屬於約簡和彙總統計,用於從Series中提取單個值(如sum和mean),或從DataFrame的行或列中提取一個Series。跟對應的Numpy陣列

    QT學習筆記13訊息機制事件

    MainWindow是我們定義的一個類。我們重寫了它的eventFilter()函式。為了過濾特定元件上的事件,首先需要判斷這個物件是不是我們感興趣的元件,然後判斷這個事件的型別。在上面的程式碼中,我們不想讓textEdit元件處理鍵盤按下的事件。所以,首先我們找到這個元件,如果這個事件是鍵盤事件,則直接返回

    [Qt學習篇]Qthread實現多執行緒操作

    一、QThread類概述                                        QThread類為使用者管理多執行緒提供了一種平臺無關的途徑。 #include <QThread> 繼承自QObject類 二、QThread

    Java學習-面向物件實現圓的關係判斷

    前言   面向物件是Java中的基本,根源,本篇部落格,小編將結合一個點和圓兩個類的關係,來好好地整理一下面向物件中的那些事。 點和圓兩個類  一、建立點類Point 1.成員變數:x,y 2.構造方

    java 實現各種資料統計

    import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.RenderingHints; import java.awt.geom.Ellipse2D; import ja

    報表統計模態視窗的設定

    有的客戶在使用潤乾報表的時候,希望點選報表中的某一個單元格或者是統計圖的時候能夠彈出一個網頁對話方塊。不是網頁,而是模態視窗。 效果如下圖所示: 下面分別對單元格彈出模態視窗傳遞單元格的值和統計圖彈出分別做一個簡單的介紹。 單元格模態視窗傳遞單元格的值: 在展現介面加如下程式碼

    使用ECharts實現各種資料統計(餅,柱狀,折線)在javaWeb中的應用

    具體的資源及頁面程式碼可下載  http://download.csdn.net/download/dll322/9912507 準備工作:要下載ECharts的原始檔 第一步:在web端既新建一個jsp頁面 第二步:引入ECharts的js 第三步:為EChart

    Android自定義View實現簡單的折線、柱狀

    首先說第一個柱狀圖,實現很簡單。一個自定義View,重現裡面的OnDraw方法。然後利用paint,canvas繪製帶填充的長方形即可。每個長方形的X軸平方View的x軸即可,長方形的高度通過簡單的計算即可得到。下面上柱狀圖程式碼 package com.hrules.

    Android自定義View——彩色圓環統計

    效果展示實現步驟1、初始化變數 //-------------必須給的資料相關------------- private String[] str = new String[]{"一年級", "二年級", "三年級", "四年級", "五年級", "六年級"};

    java實現各種資料統計(柱形,餅,折線

    最近在做資料探勘的課程設計,需要將資料分析的結果很直觀的展現給使用者,這就要用到資料統計圖,要實現這個功能就需要幾個第三方包了: 1.       jfreechart-1.0.13.jar 2.       jcommon-1.0.16.jar 3.       gnuj

    js實現表格信息的刪除添加

    nbsp tag col cti 刪除 center 選項 func onclick <!DOCTYPE html> <html> <head> <title> new document </title>

    柵格重分類條件函數均可以實現對流量統計數據進行定義劃分

    target 結構 .html ctu 定義 net hue thread 影響 ArcGIS水分分析工具的流向分析是基於D8單流向算法,如果分析使用的DEM存在凹陷點,就會產生匯,導致徑流斷流從而影響了分析結果。在前面章節《ArcGIS水文分析實戰教程(2)ArcGIS水

    我的web前端學習之路-CSS-列表表格

    表示 hang idt char rac 一個 ddr web前端 9.png list-style-image和list-style-type只能選擇一個使用 border-collapse和border-spacing不能同時使用 1 <head>

    Qt學習:VS中使用Qt出現的常見問題:QDebugQPrintDialog的使用.

    window 軟件 編程 計算機 在VS中常常會有小夥伴不知道如何使用QDebug和QPrintDialog.下面我用VS2013來教你們如何去操作.QDebug 相信很多小夥伴們發現在qt creator中使用qDebug()是可以輕易的輸出在下面的,但是在vs中在程序明明沒有錯誤的情況下,

    Qt學習: QFileDialogQMessageBox的用法程序示例

    window 軟件 編程 計算機 qt *QMessageBox的用法: members: 1.void setStandardButtons(QMessageBox::); //設置按鈕. 2.void setText(QString);