在这个案例中,通过QStandardItemModel和QTreeView类,手动创建了一个表示部门和员工隶属关系的视图。在树模型中,每个数据项的行列层次,如下图所示:
xxxxxxxxxx
1510 1 2
20 研发部
30 系统研发部
40 张飞 男 20
51 赵云 男 21
61 应用研发部
70 关羽 男 22
81 马超 男 23
91 市场部
100 国内市场部
110 黄忠 男 24
121 刘备 男 25
131 国际市场部
140 孙权 男 26
151 曹操 男 27
通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为MVTest的项目。
C:\Users\Minwei\Projects\Qt\MVTest\mvtestdialog.ui:
xxxxxxxxxx
691
2<ui version="4.0">
3 <class>MVTestDialog</class>
4 <widget class="QDialog" name="MVTestDialog">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>400</width>
10 <height>350</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>MV结构测试</string>
15 </property>
16 <layout class="QVBoxLayout" name="m_layout">
17 <item>
18 <widget class="QTreeView" name="m_tree">
19 <property name="frameShape">
20 <enum>QFrame::WinPanel</enum>
21 </property>
22 </widget>
23 </item>
24 <item>
25 <widget class="QLabel" name="m_label">
26 <property name="palette">
27 <palette>
28 <active>
29 <colorrole role="WindowText">
30 <brush brushstyle="SolidPattern">
31 <color alpha="255">
32 <red>255</red>
33 <green>0</green>
34 <blue>0</blue>
35 </color>
36 </brush>
37 </colorrole>
38 </active>
39 <inactive>
40 <colorrole role="WindowText">
41 <brush brushstyle="SolidPattern">
42 <color alpha="255">
43 <red>255</red>
44 <green>0</green>
45 <blue>0</blue>
46 </color>
47 </brush>
48 </colorrole>
49 </inactive>
50 <disabled>
51 <colorrole role="WindowText">
52 <brush brushstyle="SolidPattern">
53 <color alpha="255">
54 <red>120</red>
55 <green>120</green>
56 <blue>120</blue>
57 </color>
58 </brush>
59 </colorrole>
60 </disabled>
61 </palette>
62 </property>
63 </widget>
64 </item>
65 </layout>
66 </widget>
67 <resources/>
68 <connections/>
69</ui>
C:\Users\Minwei\Projects\Qt\MVTest\mvtestdialog.h:
xxxxxxxxxx
271
2
3
4
5
6
7QT_BEGIN_NAMESPACE
8namespace Ui { class MVTestDialog; }
9QT_END_NAMESPACE
10
11class MVTestDialog : public QDialog
12{
13 Q_OBJECT
14
15public:
16 MVTestDialog(QWidget *parent = nullptr);
17 ~MVTestDialog();
18
19private slots:
20 void on_m_tree_clicked(const QModelIndex &index);
21
22private:
23 Ui::MVTestDialog *ui;
24 QStandardItemModel* m_model;
25};
26
27// MVTESTDIALOG_H
C:\Users\Minwei\Projects\Qt\MVTest\mvtestdialog.cpp:
xxxxxxxxxx
651
2
3
4MVTestDialog::MVTestDialog(QWidget *parent)
5 : QDialog(parent)
6 , ui(new Ui::MVTestDialog)
7 , m_model(new QStandardItemModel(this))
8{
9 ui->setupUi(this);
10
11 QStringList headerLabels;
12 headerLabels << "姓名" << "性别" << "工号";
13 m_model->setHorizontalHeaderLabels(headerLabels);
14
15 m_model->setItem(0, 0, new QStandardItem("研发部"));
16
17 m_model->item(0, 0)->setChild(0, 0, new QStandardItem("系统研发部"));
18 m_model->item(0, 0)->child(0, 0)->setChild(0, 0, new QStandardItem("张飞"));
19 m_model->item(0, 0)->child(0, 0)->setChild(0, 1, new QStandardItem("男"));
20 m_model->item(0, 0)->child(0, 0)->setChild(0, 2, new QStandardItem("20"));
21 m_model->item(0, 0)->child(0, 0)->setChild(1, 0, new QStandardItem("赵云"));
22 m_model->item(0, 0)->child(0, 0)->setChild(1, 1, new QStandardItem("男"));
23 m_model->item(0, 0)->child(0, 0)->setChild(1, 2, new QStandardItem("21"));
24
25 m_model->item(0, 0)->setChild(1, 0, new QStandardItem("应用研发部"));
26 m_model->item(0, 0)->child(1, 0)->setChild(0, 0, new QStandardItem("关羽"));
27 m_model->item(0, 0)->child(1, 0)->setChild(0, 1, new QStandardItem("男"));
28 m_model->item(0, 0)->child(1, 0)->setChild(0, 2, new QStandardItem("22"));
29 m_model->item(0, 0)->child(1, 0)->setChild(1, 0, new QStandardItem("马超"));
30 m_model->item(0, 0)->child(1, 0)->setChild(1, 1, new QStandardItem("男"));
31 m_model->item(0, 0)->child(1, 0)->setChild(1, 2, new QStandardItem("23"));
32
33 m_model->setItem(1, 0, new QStandardItem("市场部"));
34
35 m_model->item(1, 0)->setChild(0, 0, new QStandardItem("国内市场部"));
36 m_model->item(1, 0)->child(0, 0)->setChild(0, 0, new QStandardItem("黄忠"));
37 m_model->item(1, 0)->child(0, 0)->setChild(0, 1, new QStandardItem("男"));
38 m_model->item(1, 0)->child(0, 0)->setChild(0, 2, new QStandardItem("24"));
39 m_model->item(1, 0)->child(0, 0)->setChild(1, 0, new QStandardItem("刘备"));
40 m_model->item(1, 0)->child(0, 0)->setChild(1, 1, new QStandardItem("男"));
41 m_model->item(1, 0)->child(0, 0)->setChild(1, 2, new QStandardItem("25"));
42
43 m_model->item(1, 0)->setChild(1, 0, new QStandardItem("国际市场部"));
44 m_model->item(1, 0)->child(1, 0)->setChild(0, 0, new QStandardItem("孙权"));
45 m_model->item(1, 0)->child(1, 0)->setChild(0, 1, new QStandardItem("男"));
46 m_model->item(1, 0)->child(1, 0)->setChild(0, 2, new QStandardItem("26"));
47 m_model->item(1, 0)->child(1, 0)->setChild(1, 0, new QStandardItem("曹操"));
48 m_model->item(1, 0)->child(1, 0)->setChild(1, 1, new QStandardItem("男"));
49 m_model->item(1, 0)->child(1, 0)->setChild(1, 2, new QStandardItem("27"));
50
51 ui->m_tree->setModel(m_model);
52 ui->m_tree->expandAll();
53 ui->m_tree->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
54}
55
56MVTestDialog::~MVTestDialog()
57{
58 delete ui;
59}
60
61void MVTestDialog::on_m_tree_clicked(const QModelIndex &index)
62{
63 ui->m_label->setText(QString("第%1行第%2列的项被点击:%3")
64 .arg(index.row()).arg(index.column()).arg(index.data().toString()));
65}
运行效果如图所示: