在这个案例中,借助QStringListModel类的对象,表示计算机内存中的字符串表,将其关联于QListView视图。只要模型中的数据发生变化,视图就会立即同步所发生的改变。用户在视图中对数据所做的修改,也会自动反映到模型中。视图与模型在任何时候,都会自动保持一致。
通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为StringList的项目。
C:\Users\Minwei\Projects\Qt\StringList\stringlistdialog.ui:
xxxxxxxxxx
1891
2<ui version="4.0">
3 <class>StringListDialog</class>
4 <widget class="QDialog" name="StringListDialog">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>700</width>
10 <height>400</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>字符串表</string>
15 </property>
16 <layout class="QGridLayout" name="m_layoutGrid">
17 <item row="0" column="0">
18 <layout class="QVBoxLayout" name="m_layoutLeft">
19 <item>
20 <spacer name="m_spacerLeftTop">
21 <property name="orientation">
22 <enum>Qt::Vertical</enum>
23 </property>
24 <property name="sizeHint" stdset="0">
25 <size>
26 <width>20</width>
27 <height>40</height>
28 </size>
29 </property>
30 </spacer>
31 </item>
32 <item>
33 <widget class="QPushButton" name="m_btnReset">
34 <property name="text">
35 <string>重置</string>
36 </property>
37 </widget>
38 </item>
39 <item>
40 <widget class="QPushButton" name="m_btnAppend">
41 <property name="text">
42 <string>添加</string>
43 </property>
44 </widget>
45 </item>
46 <item>
47 <widget class="QPushButton" name="m_btnInsert">
48 <property name="text">
49 <string>插入</string>
50 </property>
51 </widget>
52 </item>
53 <item>
54 <widget class="QPushButton" name="m_btnDelete">
55 <property name="text">
56 <string>删除</string>
57 </property>
58 </widget>
59 </item>
60 <item>
61 <widget class="QPushButton" name="m_btnClear">
62 <property name="text">
63 <string>清空</string>
64 </property>
65 </widget>
66 </item>
67 <item>
68 <spacer name="m_spacerLeftBottom">
69 <property name="orientation">
70 <enum>Qt::Vertical</enum>
71 </property>
72 <property name="sizeHint" stdset="0">
73 <size>
74 <width>20</width>
75 <height>40</height>
76 </size>
77 </property>
78 </spacer>
79 </item>
80 </layout>
81 </item>
82 <item row="0" column="1">
83 <layout class="QHBoxLayout" name="m_layoutHor">
84 <item>
85 <widget class="QListView" name="m_list">
86 <property name="frameShape">
87 <enum>QFrame::WinPanel</enum>
88 </property>
89 </widget>
90 </item>
91 <item>
92 <layout class="QVBoxLayout" name="m_layoutRight">
93 <item>
94 <spacer name="m_spacerRightTop">
95 <property name="orientation">
96 <enum>Qt::Vertical</enum>
97 </property>
98 <property name="sizeHint" stdset="0">
99 <size>
100 <width>20</width>
101 <height>40</height>
102 </size>
103 </property>
104 </spacer>
105 </item>
106 <item>
107 <widget class="QPushButton" name="m_btnList2Edit">
108 <property name="text">
109 <string>>></string>
110 </property>
111 </widget>
112 </item>
113 <item>
114 <widget class="QPushButton" name="m_btnEdit2List">
115 <property name="text">
116 <string><<</string>
117 </property>
118 </widget>
119 </item>
120 <item>
121 <spacer name="m_spacerRightBottom">
122 <property name="orientation">
123 <enum>Qt::Vertical</enum>
124 </property>
125 <property name="sizeHint" stdset="0">
126 <size>
127 <width>20</width>
128 <height>40</height>
129 </size>
130 </property>
131 </spacer>
132 </item>
133 </layout>
134 </item>
135 <item>
136 <widget class="QPlainTextEdit" name="m_edit">
137 <property name="frameShape">
138 <enum>QFrame::WinPanel</enum>
139 </property>
140 </widget>
141 </item>
142 </layout>
143 </item>
144 <item row="1" column="1">
145 <widget class="QLabel" name="m_label">
146 <property name="palette">
147 <palette>
148 <active>
149 <colorrole role="WindowText">
150 <brush brushstyle="SolidPattern">
151 <color alpha="255">
152 <red>255</red>
153 <green>0</green>
154 <blue>0</blue>
155 </color>
156 </brush>
157 </colorrole>
158 </active>
159 <inactive>
160 <colorrole role="WindowText">
161 <brush brushstyle="SolidPattern">
162 <color alpha="255">
163 <red>255</red>
164 <green>0</green>
165 <blue>0</blue>
166 </color>
167 </brush>
168 </colorrole>
169 </inactive>
170 <disabled>
171 <colorrole role="WindowText">
172 <brush brushstyle="SolidPattern">
173 <color alpha="255">
174 <red>120</red>
175 <green>120</green>
176 <blue>120</blue>
177 </color>
178 </brush>
179 </colorrole>
180 </disabled>
181 </palette>
182 </property>
183 </widget>
184 </item>
185 </layout>
186 </widget>
187 <resources/>
188 <connections/>
189</ui>
C:\Users\Minwei\Projects\Qt\StringList\stringlistdialog.h:
xxxxxxxxxx
361
2
3
4
5
6
7QT_BEGIN_NAMESPACE
8namespace Ui { class StringListDialog; }
9QT_END_NAMESPACE
10
11class StringListDialog : public QDialog
12{
13 Q_OBJECT
14
15public:
16 StringListDialog(QWidget *parent = nullptr);
17 ~StringListDialog();
18
19private slots:
20 void on_m_btnReset_clicked();
21 void on_m_btnAppend_clicked();
22 void on_m_btnInsert_clicked();
23 void on_m_btnDelete_clicked();
24 void on_m_btnClear_clicked();
25
26 void on_m_btnList2Edit_clicked();
27 void on_m_btnEdit2List_clicked();
28
29 void on_m_list_clicked(const QModelIndex &index);
30
31private:
32 Ui::StringListDialog *ui;
33 QStringListModel* m_model;
34};
35
36// STRINGLISTDIALOG_H
C:\Users\Minwei\Projects\Qt\StringList\stringlistdialog.cpp:
xxxxxxxxxx
821
2
3
4
5
6StringListDialog::StringListDialog(QWidget *parent)
7 : QDialog(parent)
8 , ui(new Ui::StringListDialog)
9 , m_model(new QStringListModel(this))
10{
11 ui->setupUi(this);
12
13 ui->m_list->setModel(m_model);
14 on_m_btnReset_clicked();
15}
16
17StringListDialog::~StringListDialog()
18{
19 delete ui;
20}
21
22void StringListDialog::on_m_btnReset_clicked()
23{
24 QStringList strings;
25 strings << "北京" << "上海" << "广州" << "深圳";
26 m_model->setStringList(strings);
27}
28
29void StringListDialog::on_m_btnAppend_clicked()
30{
31 m_model->insertRow(m_model->rowCount());
32 QModelIndex index = m_model->index(m_model->rowCount() - 1, 0);
33 m_model->setData(index, "添加数据", Qt::DisplayRole);
34 ui->m_list->setCurrentIndex(index);
35}
36
37void StringListDialog::on_m_btnInsert_clicked()
38{
39 QModelIndex index = ui->m_list->currentIndex();
40 m_model->insertRow(index.row());
41 m_model->setData(index, "插入数据", Qt::DisplayRole);
42 ui->m_list->setCurrentIndex(index);
43}
44
45void StringListDialog::on_m_btnDelete_clicked()
46{
47 m_model->removeRow(ui->m_list->currentIndex().row());
48}
49
50void StringListDialog::on_m_btnClear_clicked()
51{
52 m_model->removeRows(0, m_model->rowCount());
53}
54
55void StringListDialog::on_m_btnList2Edit_clicked()
56{
57 ui->m_edit->clear();
58
59 for (QString const& string : m_model->stringList())
60 ui->m_edit->appendPlainText(string);
61}
62
63void StringListDialog::on_m_btnEdit2List_clicked()
64{
65 on_m_btnClear_clicked();
66
67 QStringList strings;
68
69 QTextDocument* doc = ui->m_edit->document();
70 int blockCount = doc->blockCount();
71
72 for(int blockNumber = 0; blockNumber < blockCount; ++blockNumber)
73 strings << doc->findBlockByNumber(blockNumber).text();
74
75 m_model->setStringList(strings);
76}
77
78void StringListDialog::on_m_list_clicked(const QModelIndex &index)
79{
80 ui->m_label->setText(QString("第%1行第%2列的项被点击:%3")
81 .arg(index.row()).arg(index.column()).arg(index.data().toString()));
82}
运行效果如图所示:
将这个案例与先前的List案例做一个对比。在MV结构中,QStringListModel模型和QListView视图是分离且同步的。将数据加入QStringListModel,QListView即可显示,通过QListView修改数据,QStringListModel也会因之而变。List案例里的QListWidget并没有模型与之关联,数据都是以QListWidgetltem对象的形式直接存放在QListWidget内部的。数据和显示是一体的。这就是视图组件和项集组件的主要区别。