• Qt—MVC架构


    【1】代理应用示例源码

    用代码说事,比较靠谱。

    代码目录:三个自定义类,重实现QStyledItemDelegate类。main函数应用示例。

    (1)ComboDelegate.h

     1 #ifndef COMBODELEGATE_H
     2 #define COMBODELEGATE_H
     3 
     4 #include <QStyledItemDelegate>
     5 
     6 class ComboDelegate : public QStyledItemDelegate
     7 {
     8 public:
     9     ComboDelegate(QObject *parent = NULL);
    10 
    11 protected:
    12     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    13     void setEditorData(QWidget *editor, const QModelIndex &index) const;
    14     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    15     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    16 };
    17 
    18 #endif // COMBODELEGATE_H

    (2)ComboDelegate.cpp

     1 #include "ComboDelegate.h"
     2 #include <QComboBox>
     3 
     4 ComboDelegate::ComboDelegate(QObject *parent)
     5     : QStyledItemDelegate(parent)
     6 {}
     7 
     8 QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
     9 {
    10     Q_UNUSED(option);
    11     Q_UNUSED(index);
    12 
    13     QStringList list;
    14     list << "工人" << "农民" << "军人" << "律师";
    15 
    16     QComboBox *pEditor = new QComboBox(parent);
    17     pEditor->addItems(list);
    18     pEditor->installEventFilter(const_cast<ComboDelegate*>(this));
    19     return pEditor;
    20 }
    21 
    22 void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    23 {
    24     QString strText = index.model()->data(index).toString();
    25     QComboBox *pCombox = NULL;
    26     pCombox = static_cast<QComboBox*>(editor);
    27     if (pCombox != NULL)
    28     {
    29         int nIndex = pCombox->findText(strText);
    30         pCombox->setCurrentIndex(nIndex);
    31     }
    32 }
    33 
    34 void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index)const
    35 {
    36     QComboBox *pCombox = NULL;
    37     pCombox = static_cast<QComboBox*>(editor);
    38     if (pCombox != NULL)
    39     {
    40         QString strText = pCombox->currentText();
    41         model->setData(index, strText);
    42     }
    43 }
    44 
    45 void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index)const
    46 {
    47     Q_UNUSED(index);
    48     editor->setGeometry(option.rect);
    49 }

    (3)DateDelegate.h

     1 #ifndef DATEDELEGATE_H
     2 #define DATEDELEGATE_H
     3 
     4 #include <QStyledItemDelegate>
     5 
     6 class DateDelegate : public QStyledItemDelegate
     7 {
     8 public:
     9     DateDelegate(QObject *parent = NULL);
    10 
    11 protected:
    12     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    13     void setEditorData(QWidget *editor, const QModelIndex &index) const;
    14     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    15     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    16 };
    17 
    18 #endif // DATEDELEGATE_H

    (4)DateDelegate.cpp

     1 #include "DateDelegate.h"
     2 #include <QDateTimeEdit>
     3 
     4 DateDelegate::DateDelegate(QObject *parent)
     5     : QStyledItemDelegate(parent)
     6 {}
     7 
     8 // 首先创建要进行代理的窗体
     9 QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    10 {
    11     Q_UNUSED(option);
    12     Q_UNUSED(index);
    13 
    14     QDateTimeEdit *pEditor = new QDateTimeEdit(parent);      // 一个日历的控件
    15     pEditor->setDisplayFormat("yyyy-MM-dd");   // 日期时间的显示格式
    16     pEditor->setCalendarPopup(true);   // 以下拉的方式显示
    17     pEditor->installEventFilter(const_cast<DateDelegate*>(this));  // 调用这个函数安装事件过滤器,使这个对象可以捕获QDateTimeEdit对象的事件
    18     return pEditor;
    19 }
    20 
    21 // 这个是初始化作用,初始化代理控件的数据
    22 void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    23 {
    24   // 先用这个index返回这个model然后用这个model得到index对应的数据
    25   QString strDate = index.model()->data(index).toString();
    26   QDate date = QDate::fromString(strDate, Qt::ISODate);     // 根据QString类型得到相应的时间类型
    27   QDateTimeEdit *pEditor = NULL;
    28   pEditor = static_cast<QDateTimeEdit*>(editor);    // 强转为QDateTimeEdit*类型
    29   if (pEditor != NULL)
    30   {
    31       pEditor->setDate(date);      // 设置代理控件的显示数据
    32   }
    33 }
    34 
    35 // 将代理控件里面的数据更新到视图控件中
    36 // void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    37 void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    38 {
    39   QDateTimeEdit *pEditor = NULL;
    40   pEditor = static_cast<QDateTimeEdit*>(editor);    // 得到时间
    41   if (pEditor != NULL)
    42   {
    43       QDate date = pEditor->date();    // 得到时间
    44       model->setData(index, QVariant(date.toString(Qt::ISODate)));    // 把值放到相应的index里面
    45   }
    46 }
    47 
    48 // 代理中数据的改变放到model中
    49 // void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    50 void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
    51 {
    52     Q_UNUSED(index);
    53     editor->setGeometry(option.rect);
    54 }

    (5)SpinDelegate.h

     1 #ifndef SPINDELEGATE_H
     2 #define SPINDELEGATE_H
     3 
     4 #include <QStyledItemDelegate>
     5 
     6 class SpinDelegate : public QStyledItemDelegate
     7 {
     8 public:
     9     SpinDelegate(QObject *parent = NULL);
    10 
    11 protected:
    12     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    13     void setEditorData(QWidget *editor, const QModelIndex &index) const;
    14     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    15     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    16 };
    17 
    18 #endif // SPINDELEGATE_H

    (6)SpinDelegate.cpp

     1 #include "SpinDelegate.h"
     2 
     3 #include <QSpinBox>
     4 
     5 SpinDelegate::SpinDelegate(QObject *parent)
     6     : QStyledItemDelegate(parent)
     7 {
     8 }
     9 
    10 QWidget *SpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    11 {
    12     Q_UNUSED(option);
    13     Q_UNUSED(index);
    14 
    15     QSpinBox *pEditor = new QSpinBox(parent);
    16     pEditor->setRange(0, 30000);
    17     pEditor->installEventFilter(const_cast<SpinDelegate*>(this));
    18     return pEditor;
    19 }
    20 
    21 void SpinDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    22 {
    23     int value = index.model()->data(index).toInt();
    24     QSpinBox *pSpinbox = NULL;
    25     pSpinbox = static_cast<QSpinBox*>(editor);
    26     if (pSpinbox != NULL)
    27     {
    28         pSpinbox->setValue(value);
    29     }
    30 }
    31 
    32 void SpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    33 {
    34     QSpinBox *pSpinbox = NULL;
    35     pSpinbox = static_cast<QSpinBox*>(editor);
    36     if (pSpinbox != NULL)
    37     {
    38         int value = pSpinbox->value();
    39         model->setData(index, value);
    40     }
    41 }
    42 
    43 void SpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
    44 {
    45     Q_UNUSED(index);
    46 
    47     editor->setGeometry(option.rect);
    48 }

    (7)main.cpp

     1 #include <QApplication>
     2 #include <QFile>
     3 #include <QDebug>
     4 #include <QWidget>
     5 #include <QTableView>
     6 #include <QTextStream>
     7 #include <QStandardItemModel>
     8 #include "DateDelegate.h"
     9 #include "ComboDelegate.h"
    10 #include "SpinDelegate.h"
    11 
    12 int main(int argc, char *argv[])
    13 {
    14     QApplication a(argc, argv);
    15 
    16     QStandardItemModel model(4, 4);
    17     model.setHeaderData(0, Qt::Horizontal, QLatin1String("Name"));
    18     model.setHeaderData(1, Qt::Horizontal, QLatin1String("Birthday"));
    19     model.setHeaderData(2, Qt::Horizontal, QLatin1String("Job"));
    20     model.setHeaderData(3, Qt::Horizontal, QLatin1String("Income"));
    21 
    22     QFile file(QLatin1String("/mnt/liuy/info"));
    23     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    24     {
    25         qDebug() << "open the file failed...";
    26         return -1;
    27     }
    28 
    29     QTextStream out(&file);
    30     QString line;
    31     model.removeRows(0, model.rowCount(QModelIndex()), QModelIndex());
    32     int row = 0;
    33     do
    34     {
    35         line = out.readLine();
    36         if (!line.isEmpty())
    37         {
    38             model.insertRows(row, 1, QModelIndex());
    39             QStringList pieces = line.split(",", QString::SkipEmptyParts);
    40             model.setData(model.index(row, 0, QModelIndex()), pieces.value(0));
    41             model.setData(model.index(row, 1, QModelIndex()), pieces.value(1));
    42             model.setData(model.index(row, 2, QModelIndex()), pieces.value(2));
    43             model.setData(model.index(row, 3, QModelIndex()), pieces.value(3));
    44             ++row;
    45         }
    46     } while(!line.isEmpty());
    47     file.close();
    48 
    49     QTableView tableView;
    50     tableView.setModel(&model); // 绑定Model
    51     tableView.setWindowTitle(QLatin1String("Delegate"));
    52 
    53     DateDelegate dateDelegate;
    54     tableView.setItemDelegateForColumn(1, &dateDelegate); // 第一列代理
    55     ComboDelegate comboDelegate;
    56     tableView.setItemDelegateForColumn(2, &comboDelegate);// 第二列代理
    57     SpinDelegate spinDelegate;
    58     tableView.setItemDelegateForColumn(3, &spinDelegate); // 第三列代理
    59 
    60     tableView.resize(500, 300); // 重置大小
    61     tableView.show();
    62 
    63     return a.exec();
    64 }

    备注:此示例运行环境为UBuntu + Qt5.3.2

    【2】读取的信息文件

    文件info 内容如下(注意:文件格式):

    Liu,1977-01-05,工人,1500
    Wang,1987-11-25,医生,2500
    Sun,1967-10-05,军人,500
    Zhang,1978-01-12,律师,4500

    【3】运行效果图

    运行效果图:

    第二列编辑图(时间日期控件):

    第三列编辑图(下拉框控件):

    第四列编辑图(微调框控件):

    Good Good Study, Day Day Up.

    顺序 选择 循环 总结

  • 相关阅读:
    ASP.NET:在一般处理程序中通过 Session 保存验证码却无法显示图片?
    HTML中哪些标签的值会被提交到服务器呢?
    Java泛型之Type体系
    Java 调用 shell 脚本详解
    quartz详解2:quartz由浅入深
    Java 服务端监控方案(四. Java 篇)
    Apache Storm 学习资料
    开源框架是如何通过JMX来做监控的(一)
    Kafka Streams简介: 让流处理变得更简单
    linux 技巧:使用 screen 管理你的远程会话
  • 原文地址:https://www.cnblogs.com/Braveliu/p/7488250.html
Copyright © 2020-2023  润新知