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.

顺序 选择 循环 总结

posted @ 2017-09-07 10:00  kaizenly  阅读(6581)  评论(0编辑  收藏  举报
打赏