Qt Model_View_学习笔记(格式修改版)
- 格式:pdf
- 大小:409.90 KB
- 文档页数:23
qtableview的用法QTableView是Qt框架中的一个重要的控件,用于显示二维表格数据。
它是基于模型-视图设计模式实现的,可以方便地展示和编辑数据。
本文将介绍QTableView的用法,并详细解释如何使用QTableView显示数据、设置表头、排序、过滤和编辑数据等功能。
一、QTableView的基本用法QTableView是继承自QAbstractItemView的控件,它需要一个数据模型(QAbstractTableModel或QStandardItemModel)来提供数据。
在使用QTableView之前,我们首先需要创建一个QTableView对象,并设置好数据模型。
1. 创建QTableView对象:```cppQTableView *tableView = new QTableView(parent);```2. 设置数据模型:```cppQStandardItemModel *model = new QStandardItemModel(parent); tableView->setModel(model);```3. 设置表格大小:```cpptableView->setFixedSize(width, height);```二、显示数据在设置好数据模型之后,我们可以通过setData()函数向模型中添加数据,并通过setHeaderData()函数设置表头。
1. 添加数据:```cppmodel->setData(model->index(row, column), value);```2. 设置表头:```cppmodel->setHeaderData(column, Qt::Horizontal, headerText);```三、排序和过滤数据QTableView提供了排序和过滤数据的功能,可以方便地对表格中的数据进行排序和筛选。
1. 排序数据:```cpptableView->setSortingEnabled(true);```2. 过滤数据:```cppQSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(parent);proxyModel->setSourceModel(model);tableView->setModel(proxyModel);proxyModel->setFilterRegExp(filterString);```四、编辑数据QTableView还可以编辑数据,我们可以通过设置编辑策略来控制哪些单元格可以编辑。
汇文教育;QFil eInfo类1、q filei nfo提供有关文件系统中的,文件的名称和位置信息(路径),它的访问权限,以及它是否是一个目录或符号链接,该文件的大小和最后修改/读取时间也可用。
2、QFil eInFo可以指向一个文件,一个相对或一个绝对文件路径,绝对文件路径开始与目录分隔符“/”或驱动器的规格(除了在UNI X),相对文件名开始有一个目录名或一个文件名,并指定一个相对于当前工作目录的路径.一个绝对路径的一个例子是一个字符串“/tmp /qua ltz”,相对路径可能看起来像“src / fa tlib”,你可以使用这个函数isrel ative()来检查 qfil einfo是否使用相对或绝对路径的文件,你可以调用函数co nvert toabs()转换 qfil einfo的相对路径为绝对路径。
这q filei nfo文件在构造函数中设置或后setfi le(),使用exi sts()看文件是否存在,si ze()得到它的大小。
加速性能,qf ilein fo缓存文件有关的信息,因为文件可以被其他用户或程序更改,甚至由同一程序的其他部分,这个函数refr esh(),刷新文件信息,如果你想关闭一个qfi leinf o的缓存和强制访问文件系统每次请求信息,你可以调用setCa ching(FALS E).文件的类型是获得通过i sfile(),is dir()和isSy mlink()该文件的日期由 crea ted(), las tModi fied() and last Read(),文件的访问权限由isRe adabl e(),isWri table() an d isE xecut able()获得。
一、介绍Qt是一款跨评台的C++应用程序开发框架,拥有丰富的UI控件库,可以帮助开发者快速构建各种桌面应用程序。
其中,Qt的QTreeView控件是用来显示树形结构数据的控件,通常用于显示文件系统、目录结构、数据分类等。
在本文中,将介绍Qt中QTreeView控件的高级用法,包括自定义数据模型、自定义视图以及树节点的操作等内容。
二、自定义数据模型1. 继承QAbstractItemModel在Qt中,通过继承QAbstractItemModel类可以实现自定义的数据模型。
我们可以根据自己的数据结构和需求来实现自己的数据模型,包括数据的组织方式、展示方式以及数据的增删改查等操作。
2. 实现必要的虚函数在自定义数据模型中,需要实现一些必要的虚函数,包括rowCount()、columnCount()、data()、index()等函数,用来告诉QTreeView控件如何获取数据、显示数据以及处理用户操作等。
3. 使用自定义数据模型创建自定义数据模型后,可以通过setModel()函数将数据模型应用到QTreeView控件中,从而实现树形结构的显示和操作。
三、自定义视图1. 继承QTreeView除了自定义数据模型,Qt还允许开发者自定义QTreeView控件的视图样式。
通过继承QTreeView类并重写相关的绘制函数,可以实现自定义的视图效果,包括节点的样式、展开/折叠的图标以及节点的编辑等功能。
2. 实现p本人ntEvent()函数在自定义QTreeView的视图样式时,通常需要重写p本人ntEvent()函数,以实现节点的自定义绘制效果。
开发者可以根据自己的需求和设计,绘制不同样式的节点、连接线以及展开/折叠的图标等。
3. 使用自定义视图创建自定义的QTreeView视图后,可以通过setView()函数将自定义的视图应用到QTreeView控件中,从而实现不同的视觉效果和交互体验。
四、树节点的操作1. 增加、删除节点在使用QTreeView控件时,通常需要实现对树节点的增加、删除操作。
qtableview的用法一、概述QTableView是Qt框架中的一个重要控件,用于显示和编辑表格数据。
它提供了丰富的功能和灵活的接口,可以满足各种表格数据显示的需求。
本文将详细介绍QTableView的用法,包括数据模型的设置、表头的设置、单元格的编辑以及信号与槽的连接等。
二、数据模型的设置在使用QTableView之前,我们需要先设置数据模型。
数据模型负责提供表格的数据,并将其与QTableView进行关联。
Qt提供了QAbstractTableModel和QStandardItemModel两个常用的数据模型类,我们可以根据实际需求选择其中之一。
1. QAbstractTableModelQAbstractTableModel是一个抽象类,我们需要继承它并实现一些纯虚函数来完成自定义的数据模型。
以下是一个简单的例子:class MyTableModel : public QAbstractTableModel{public:MyTableModel(QObject *parent = nullptr): QAbstractTableModel(parent){// 初始化数据m_data << QVector<QString>{"Alice", "25", "Female"}<< QVector<QString>{"Bob", "30", "Male"}<< QVector<QString>{"Cindy", "28", "Female"};}int rowCount(const QModelIndex &parent = QModelIndex()) const override{if (parent.isValid())return 0;return m_data.size();}int columnCount(const QModelIndex &parent = QModelIndex()) const override{if (parent.isValid())return 0;if (m_data.isEmpty())return 0;return m_data.first().size();}QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override{if (!index.isValid())return QVariant();if (role == Qt::DisplayRole || role == Qt::EditRole)return m_data[index.row()][index.column()];return QVariant();}private:QVector<QVector<QString>> m_data;};在上述代码中,我们定义了一个名为MyTableModel的类,继承自QAbstractTableModel。
Qt中的每个类,都有一个对应的同名头文件,其中包含其类定义。
例如要使用Q Appli catio n类,则需要在程序中添加" #includ e <QAppli catio n>"QAppli catio n类用于管理应用程序范围内的资源。
其构造函数需要main函数的ar gc和ar gv作为参数。
widget被创建时都是不可见的(always create d hidden)。
widget中可容纳其它widg et。
Qt中的wi dget在有用户行为或状态改变时会emi t signal。
signal可以和sl ot函数连接在一起(connec t),这样当有si gnal被emit时,对应的slo t函数会被自动调用。
QWidge t类的构造函数需要一个 QWidge t * 指针作为参数,表示其par ent widget(默认值为0,即不存在pa rentwidget)。
在paren t widget被删除时,Qt会自动删除其所有的child widget。
Qt中有三种Layou t Manage r 类: QHBoxL ayout,QVBoxL ayOut,QGridL ayOut。
基本模式是将widge t添加进L ayOut,由Layou t自动接管widge t的尺寸和位置。
启动Qt程序时可以通过 -style参数改变程序的默认显式风格。
Chapte r 2 Creati ng Dialog s2.1 Subcla ssing DialogQt中所有d ialog的基类是Q Dialo g。
QDialo g派生自Q Widge t。
Qt中所有定义了sig nal或s lot的类,在其类定义的开始处都要使用Q_O BJECT宏。
qtableview用法QTableView是Qt中的一个重要控件之一,用于显示表格数据。
它是Model/View架构的一部分,可以通过模型对其进行QAbstractItemModel的子类,QStandardItemModel的子类或自定义模型进行操作。
在这篇文章中,我们将讨论QTableView的使用方法,并给出一些示例代码来演示如何使用它。
基础功能QTableView是一个展示模型提供的数据的控件。
这些数据可以来自于你自定义的模型,或者是Qt自带的模型类。
在展示数据的同时,QTableView还提供了诸如排序、筛选、编辑等功能。
以下是QTableView的一些基础功能。
数据绑定使用QTableView,首先需要为它绑定一个数据模型。
绑定模型的方式可以是:QAbstractItemModel* model = new QStandardItemModel(4, 4, this);ui->tableView->setModel(model);在这个示例中,我们使用QStandardItemModel类创建了一个4x4的表格,并将其绑定到QTableView中。
排序QTableView支持按照某一列数据进行排序。
这个功能是通过QSortFilterProxyModel实现的。
在排序前需要将绑定的模型设置为QSortFilterProxyModel的子类。
QStandardItemModel* model = new QStandardItemModel(4, 4, this);for(int i=0; i<4; ++i){for(int j=0; j<4; ++j){QStandardItem *item = newQStandardItem(QString("%1, %2").arg(i).arg(j));model->setItem(i, j, item);}}ui->tableView->setModel(model);QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);proxyModel->setSourceModel(model);ui->tableView->setSortingEnabled(true);ui->tableView->setModel(proxyModel);筛选QTableView支持简单的文本筛选功能,默认情况下,它为每一列提供了过滤功能。
Qt学习笔记TableWidget使用说明和增删改操作的实现看一下效果很简单的一个小功能先说分部讲一下过程再给出详细代码添加数据MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->tableWidget->setColumnCount(2);ui->tableWidget->setRowCount(2);ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"ag e");ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置为可以选中单个ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("1"));ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("20"));ui->tableWidget->selectRow(0);}进行增删除修改操作#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->tableWidget->setColumnCount(2);ui->tableWidget->setRowCount(2);ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"ag e");ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置为可以选中单个ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("1"));ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("20"));ui->tableWidget->selectRow(0);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous){if(previous!=Q_NULLPTR){previous->setBackgroundColor(Qt::transparent);}if(current==Q_NULLPTR)return;current->setBackgroundColor(Qt::blue);}void MainWindow::on_btn_Add_clicked(){// QAbstractItemModel *model = ui->tableWidget->model();// model->insertRow(model->rowCount());int cols=ui->tableWidget->columnCount();int rows=ui->tableWidget->rowCount();qDebug()<<rows;ui->tableWidget->insertRow(rows);for(int i=0;i<cols;i++){ui->tableWidget->setItem(rows,i,newQTableWidgetItem("new"+QString::number(rows)));}ui->tableWidget->selectRow(rows);}void MainWindow::on_btn_Del_clicked(){QTableWidgetItem * item = ui->tableWidget->currentItem();if(item==Q_NULLPTR)return;ui->tableWidget->removeRow(item->row());}void MainWindow::on_btn_Modify_clicked(){QModelIndex index = ui->tableWidget->currentIndex();QList<QTableWidgetItem *> listItem =ui->tableWidget->selectedItems();if(listItem.count()==0)return;foreach (QTableWidgetItem * item, listItem) {item->setText("modify");}// QTableWidgetItem * item = ui->tableWidget->currentItem();// if(item==Q_NULLPTR)return;// item->setText("modify");}这里有一些对TableWidget的设置说明一下1. 将表格变为禁止编辑在默认情况下,表格里的字符是可以更改的,比如双击一个单元格,就可以修改原来的内容,如果想禁止用户的这种操作,让这个表格对用户只读,可以这样:tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚举中的一个,都是触发修改单元格内容的条件:QAbstractItemView.NoEditTriggers 0 No editing possible. 不能对表格内容进行修改QAbstractItemView.CurrentChanged 1 Editing start whenever current item changes.任何时候都能对单元格修改QAbstractItemView.DoubleClicked 2 Editing starts when an item is double clicked.双击单元格QAbstractItemView.SelectedClicked 4 Editing starts when clicking on an already selected item.单击已选中的内容QAbstractItemView.EditKeyPressed 8 Editing starts when the platform edit key has been pressed over an item.3.单个选中和多个选中的设置:tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置为可以选中多个目标该函数的参数还可以是:QAbstractItemView.NoSelection 不能选择QAbstractItemView.SingleSelection 选中单个目标QAbstractItemView.MultiSelection 选中多个目标QAbstractItemView.ExtendedSelection QAbstractItemView.ContiguousSelect ion 的区别不明显,主要功能是正常情况下是单选,但按下Ctrl或Shift键后,可以多选4. 表格表头的显示与隐藏如果两种都要设置,只要用Qt.AlignHCenter | Qt.AlignVCenter 的方式即可3. 合并单元格效果的实现:tableWidget->setSpan(0, 0, 3, 1) # 其参数为:要改变单元格的1行数2列数要合并的3行数4列数4. 设置单元格的大小首先,可以指定某个行或者列的大小tableWidget->setColumnWidth(3,200);tableWidget->setRowHeight(3,60);还可以将行和列的大小设为与内容相匹配tableWidget->resizeColumnsToContents();tableWidget->resizeRowsToContents();5. 获得单击单元格的内容通过实现itemClicked (QTableWidgetItem *) 信号的槽函数,就可以获得鼠标单击到的单元格指针,进而获得其中的文字信息connect(tableWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this, SLOT(getItem(QTreeWidgetItem*,int)));//将itemClicked信号与函数getItem绑定6.QTableWidget要调整表格行宽主要涉及以下一个函数resizeColumnsToContents(); 根据内容调整列宽resizeColumnToContents(int col); 根据内容自动调整给定列宽horizontalHeader()->setResizeMode 把给定列设置为给定模式主要模式有Stretch和Fixed7.int row = rowCount();removeRow(row);//清除已有的行列setShowGrid(true);//显示表格线verticalHeader()->setVisible(false);//隐藏左边垂直QHeaderView *headerView = horizontalHeader();headerView->setMovable(false);//去除表头的移动headerView->resizeSection(0,284);//设置第一列宽headerView->resizeSection(1,127);//设置第二列宽headerView->setResizeMode(QHeaderView::Fixed);//列表不能移动headerView->setClickable(false);//不响应鼠标单击setEditTriggers(QTableWidget::NoEditTriggers);//不能编辑setSelectionBehavior(QTableWidget::SelectRows);//一次选中一行setSelectionMode(QAbstractItemView::SingleSelection);//只能单选/*QScrollBar *scrollBar = horizontalScrollBar();scrollBar->hide();*/setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//去掉水平滚动条setVerticalScrollMode(QAbstractItemView::ScrollPerItem);//垂直滚动条按项移动setAutoScroll(false);//去掉自动滚动。
QT学习笔记4:QT中GraphicsView编程⼀、QGraphicsScene1、QGraphicsSceneQGraphicsScene继承⾃QObject,是⼀个管理图元的容器,与QGraphicsView合⽤可以在2D屏幕上显⽰如线、三⾓形、⽂本、⾃定义图元等图元。
QGraphicsScene是不可见的,只⽤于管理图元。
为了查看场景,需要创建⼀个视图组件。
⼀个场景分为三个层:图元层、前景层和背景层。
场景的绘制总是从背景层开始,然后是图形项层,最后是前景层。
2、事件处理与传播QGraphicsScene的责任之⼀是传播来⾃视图的事件。
要发送⼀个事件到场景,需要构造⼀个继承⾃QEvent的事件,使⽤QApplication::sendEvent()函数发送事件。
event()函数负责派发事件到各个图元。
常⽤的事件会被便利事件处理函数处理,如⿏标按下事件会被mousePressEvent()函数处理。
按键事件会被派发到焦点图元。
为了设置焦点图元,可以调⽤setFocusItem()函数,或是图元⾃⾝调⽤QGraphicsItem::setFocus()函数。
调⽤focusItem()函数可以获取当前的焦点图元。
为了兼容图形组件,场景维护着⾃⼰的焦点信息。
默认场景并没有焦点,并且所有的按键事件会别丢弃。
如果setFocus()函数被调⽤,或是场景中⼀个图元获得了焦点,场景会⾃动获得焦点。
如果场景有焦点,hasFocus()函数会返回true,按键事件会被发送到焦点图元。
如果场景失去了焦点,⽽图元有焦点(如调⽤clearFocus()函数),场景会维护图元的焦点信息,⼀旦场景重新获得焦点,会确保最后⼀个有焦点的图元获得焦点。
对于悬停效果,QGraphicsScene会派发悬停事件,如果某个图元接受了悬停事件(调⽤QGraphicsItem::acceptHoverEvents()),当⿏标进⼊图元的区域时,图元会接收到⼀个GraphicsSceneHoverEnter事件。
qt table view使用技巧本文介绍了Qt Table View使用技巧,包括编辑、添加、删除、自定义样式以及排序等。
一、编辑1、双击单元格编辑:双击单元格以编辑其中的内容,在双击之后,编辑框将出现,可以进行编辑,编辑完成后按下回车键保存编辑结果,或者点击表格以外的地方退出编辑模式。
2、重写edit函数:如果想要实现更加丰富的编辑功能,可以重写TableModel类中的edit函数,该函数定义如何处理编辑,可以通过传入参数获取编辑的单元格信息,以及更新表格数据。
3、选择编辑模式:使用QTableView的setEditTriggers函数可以设置编辑模式,可以通过设置的参数来控制通过何种方式进行编辑,如可以控制是否通过双击来进行编辑,是否点击时就进行编辑等。
二、添加1、添加新行:使用insertRow函数可以添加新行,该函数接受一个参数,表示在哪一行之后添加新行,如果参数为-1,则表示添加在最后一行之后,添加完行之后可以再添加行数据,比如新行的列值等等。
2、插入行:使用insertRows函数可以插入多行,该函数接受两个参数,第一个参数表示插入的位置,第二个参数表示要插入多少行,如果第二个参数大于1,则相应多行将被插入,插入完行之后可以再添加行数据。
三、删除1、删除单行:使用removeRow函数可以从表格中删除单行,该函数只接受一个参数,表示要删除哪一行。
2、批量删除:使用removeRows函数可以从表格中批量删除多行,该函数接受两个参数,第一个参数表示从哪一行开始删除,第二个参数表示要删除多少行,如果第二个参数大于1,则相应多行将被删除。
四、自定义样式1、设置字体:使用QTableView的setFont函数可以设置表格的字体,可以设置表格字体的大小、样式以及颜色等。
2、设置单元格颜色:使用QTableView的 setData函数可以设置表格单元格的背景颜色,这样可以根据表格的数据改变单元格的背景颜色,以提供更好的可视化效果。
1、QGridLayoutQGridLayout包含多个grid,它并没有要求其中的每个grid的size相同,通常情况下,每个grid的size是不同的。
对于成员函数addWidget(widget, fromRow, fromColumn, rowSpan, columnSpan, alignment):rowSpan表示新添加进来的widget在垂直方向上跨越或者占据多少个grid。
columnSpan表示新添加进来的widget在水平方向上跨越或者占据多少个grid。
2、line edit的input mask对一个line edit设置了input mask属性后,也就限定了输入字符。
一般情况下,需要填写的字符位置是空白的,但是,你可以让该空白以某个字符占位,你只需在指定input mask 的字符末尾添加―*?‖即可,把‗?‘换为你想用来占位的一个字符。
3、利用designer设计ui总体上来说,先创建各个控件,然后设置layout相对来说好些。
另外,grid layout对设置布局前的窗口布局依赖比较大,即如果设置grid layout前的布局不同,则生效后的差别可能较大。
4、QLabel的buddy属性在qt中,只有QLabel实现了buddy机制。
只有你为QLabel设置了buddy后,文本中的字符‗&‘才能以下划线显示(这点与其他widget 不同),并创建了对应的快捷键(当然,需要+Alt),然后可以利用快捷键迅速的把光标定位到该QLabel的buddy中,例如:QLabel *what = new QLabel(―Find &What:‖);该实例对应快捷键Alt+w。
5、QMouseEvent中的坐标QMouseEvent中保存了两个坐标,一个是全局坐标,当然另外一个是局部坐标。
全局坐标(globalPos())即是桌面屏幕坐标(screen coordinates),这个跟windows下的调用getCursorPos函数得到的结果一致。
qt6 c++开发指南学习笔记下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!qt6 c++开发指南学习笔记第一章:Qt6简介。
【QMLModel-View】TableView使⽤TableView 就是 Qt Quick 为表格式呈现数据提供的组件。
想必兄台⽤过 Excel,可以藉此想象下 TableView 的效果。
TableView 与 ListView 类似,相⽐之下多了滚动条、挑选、可调整尺⼨的表头等特性。
它的数据也通过 Model 来提供,你可以使⽤ ListModel、XmlListModel,也可以使⽤ C++ 中从 QAbstractltemModel、QAbstractTableModel 等继承⽽实现的 Model。
使⽤ ListView 也可以将数据呈现为表格样式,不过稍微有些复杂,尤其是 delegate 的定义,当数据有很多列(⽐如播放列表、进销存管理、学⽣成绩表等)时,就会很复杂,再要有排序之类的操作,那就……此时就是 TableView 的⽤武之地了。
⼀、—个简单的TableView实例下⾯是前⾯讲 ListView 时的⽰例,采⽤ TableView 来重写⼀下。
QML ⽂件 phone_table_ simple.qml 的内容如下:import QtQuick 2.0import QtQuick.Window 2.3import QtQuick.Controls 1.2Window {width: 360height: 360visible: trueTableView{id: phoneTableanchors.fill: parentfocus: true// TableViewColumn 描述表格的每⼀列TableViewColumn{role: "name"; title: "Name"; width: 80; elideMode: Text.ElideRight;}TableViewColumn{role: "cost"; title: "Cost"; width: 100;}TableViewColumn{role: "manufacture"; title: "Manufacture"; width: 140;}model: ListModel{id: phoneModelListElement{name: "rongyao2";cost: "4900";manufacture: "huawei"}ListElement{name: "s6";cost: "4800";manufacture :"sumsung"}ListElement{name: "apple5"cost: "3300"manufacture: "apple"}ListElement{name: "Mi5"cost: "3200"manufacture: "xiaomi"}} // model is end}}效果如下图所⽰:⼆、TableViewColumn 属性讲解定义了 TableViewColumn,描述表格的每⼀列,这是必需的,否则表格⽆法显⽰。
QGraphic学习笔记-图文一个小的简单的游戏引出的心得体会分解实例1实例描述:实现一个按钮,按钮继承自QGraphicObject,头文件:clamyButton:publicQGraphicObject{Q_OBJECTpublic:myButton(int,int,QString,QString,claMainWindow 某);QRectFboundingRect()cont;voidpaint(QPainter某,contQStyleOptionGraphicItem某,QWidget某);protected: voidhoverEnterEvent(QGraphicSceneHoverEvent某);voidhoverLeaveEvent(QGraphicSceneHoverEvent某);voidmouePreEvent(QGraphicSceneMoueEvent某);private: QPi某mappi某;QStringimg;QStringhoverImg;claMainWindow某m;Phonon::MediaObject某clickMic;ignal:voidclickSig();};源文件:myButton::myButton(int某,inty,QStringimg,QStringhoverImg,claMainWindow某m){thi->img=img;thi->hoverImg=hoverImg;pi某.load(img);etPo(某-pi某.width()/2,y-pi某.height()/2);thi->m=m;etFlag(QGraphicItem::ItemIFocuable);etFlag(QGraphicItem::Ite mIMovable);etAcceptHoverEvent(true);clickMic=Phonon::createPlayer(Phonon::MuicCategory,Phonon::MediaSource(\));}QRectFmyButton::boundingRect()cont{returnQRectF(0,0,pi某.width(),pi某.height());}voidmyButton::paint(QPainter某painter,contQStyleOptionGraphicItem某option,QWidget某widget){ painter->drawPi某map(0,0,pi某.width(),pi某.height(),pi 某);}voidmyButton::hoverEnterEvent(QGraphicSceneHoverEvent某){etFocu(Qt::MoueFocuReaon);pi某.load(hoverImg);clickMic->play();update();}voidmyButton::hoverLeaveEvent(QGraphicSceneHoverEvent某){etFocu(Qt::MoueFocuReaon);pi某.load(img);update();}voidmyButton::mouePreEvent(QGraphicSceneMoueEvent某){emitclickSig();}引用文件:cjScene=newQGraphicScene;//新建场景指针cjScene->clear();myButton某btn=newmyButton(width/2,height/2-200,\,\tn2.png\,thi);connect(btn,SIGNAL(clickSig()),thi,SLOT(guanKaScene()));cjSc ene->addItem(btn);myButton某oundBtn=newmyButton(width/2,height/2,\,\png\,thi);cjScene->addItem(oundBtn);myButton某quitBtn=newmyButton(width/2,height/2+200,\,\2.png\,thi);connect(quitBtn,SIGNAL(clickSig()),thi,SLOT(cloe()));cjScene ->addItem(quitBtn);cjScene->etSceneRect(0,0,width,height);cjScene->etBackgroundBruh(QPi某map(\).caled(width,height));thi->etScene(cjScene);绘制动画精灵1:voidninjia::play(){voidninjia::move_play(inti){qDebug()<QStringpath=\;pi某.load(path);return;}QStringpath=\+QString::number(i)+\;pi某.load(path);}绘制动画精灵2:voidtarget::move_play(inti){qDebug()<QStringpath=imgPath+QString::number(i)+\;pi某.load(path);}精灵的碰撞检测:booltarget::iColliding(){QLititem_lit=collidingItem();QGraphicItem某item;foreach(item,item_lit){if(item->data(1)==\){item->tackBefore(thi);}if((item->data(1)==\||item->data(1)==\)&&(thi->boundingRect().y()+thi->po().y()+thi->boundingRect().height())boundingRect().y()+item->po().y()+item->boundingRect().height())){thi->tackBefore(item);}if(item->data(1)==\&&item->data(2)!=fale){life=life-((projectile某)item)->gePower();m->deleteItem((projectile某)item);item->etData(2,fale);if(life>0){returntrue;}m->updateScore(10);thi->etData(2,fale);returntrue;}}returnfale;}子弹的发射voidmyScene::mouePreEvent(QGraphicSceneMoueEvent某e){projectile某p=newprojectile(某,y,m,angleValue,6,\,m->getAttack());thi->addItem(p);pewMic->paue();pewMic->play();子弹的自动移动与移除:voidprojectile::advance(inti){moveBy(co(angleValue)某peed,in(angleValue)某peed);if(thi->data(2)==fale||po().某()>thi->m->cene()->width()||po().y()>thi->m->cene()->height()||po().y()<0||po().某()<0){drop();//移除本身removeItem(thi);}}子项目自动运行函数:voidbaeProperty::advance(int){iColliding();}场景中设置文字:gameScene->etSceneRect(0,0,width,height);etScene(gameScene);game_core=newQGraphicTe某tItem(0,gameScene);game_core->etHtml(\color=red>分数:\+QString::number(core)+\);game_core->etFont(QFont(\,20,QFont::Bold));game_core->etPo(10,10);game_attack=newQGraphicTe某tItem(0,gameScene);game_attack->etHtml(\color=red>攻击力:\+QString::number(attackPower)+\);game_attack->etFont(QFont(\,20,QFont::Bold));game_attack->etPo(10,70);life_te某t=newQGraphicTe某tItem(0,gameScene);life_te某t->etHtml(\color=red>生命:\+QString::number(attackPower)+\);life_te某t->etFont(QFont(\,20,QFont::Bold));life_te某t->etPo(10,40);bB=newbloodBar(80,50,thi);gameScene->addItem(bB);Animation动画方法一、item继承QGraphicObject,并联合使用QPropertyAnimation方法三、调用QGraphicScene::advance(),此函数转而调用QGraphicItem::advance()TheQGraphicObjectclaprovideabaeclaforallg raphicitemthatrequireignal,lotandpropertie.Theclae某tendaQGraphicItemwithQObject'ignal/lotandpropertymechanim.Itmapm anyofQGraphicItem'baicetterandgettertopropertieandaddnotificatio nignalformanyofthem.TheQGraphicSceneclaprovideaurfaceformanagingalargenumberof2D graphicalitem.TheclaerveaacontainerforQGraphicItem.ItiuedtogetherwithQGraphicViewforviualizinggraphicalitem,uchaline,rectangl e,te某t,orevencutomitem,ona2Durface.QGraphicSceneipartoftheGraphicView Framework.通过调用cene()的advance(),则item会调用advance()函数:voidMainWindow::updateItem(){thi->cene()->advance();cene()->update();}返回item列表QLititem_lit=cene()->item();QGraphicItem某item;foreach(item,item_lit){//操作。
明王是一名具有丰富经验的qt开发工程师,他有着多年的qt开发实战经验,曾参与多个大型项目的开发,积累了大量的qt开发经验和技巧。
在这篇文章中,我将根据明王的讲课内容,为大家整理出一份qt 开发笔记大纲,希望能够帮助那些正在学习qt开发的朋友们更好地系统地学习和掌握qt开发的知识。
一、qt开发环境的搭建1. 安装qt开发环境1.1 Windows评台下的qt安装1.2 Linux评台下的qt安装1.3 macOS评台下的qt安装2. qt开发工具的配置2.1 IDE的选择2.2 编译器的选择2.3 qt插件的安装二、qt基础知识1. qt的基本概念1.1 qt的特点1.2 qt的架构1.3 qt的应用范围2. qt的核心模块2.1 QtCore模块2.2 QtGui模块2.3 QtWidgets模块2.4 QtMultimedia模块2.5 QtNetwork模块2.6 QtSql模块2.7 QtWebKit模块2.8 其他模块介绍和应用场景分析三、qt UI设计与布局1. qt的UI设计工具1.1 Qt Designer介绍1.2 Qt Creator介绍2. qt的基本控件2.1 QLabel2.2 QPushButton2.3 QLineEdit2.4 QComboBox2.5 QCheckBox2.6 QRadioButton2.7 其他常用控件介绍3. qt的布局管理3.1 布局管理器的概念3.2 QHBoxLayout3.3 QVBoxLayout3.4 QGridLayout3.5 实际布局案例分析四、qt信号与槽机制1. 信号槽的基本概念1.1 信号和槽的作用1.2 信号槽的连接方式2. 信号槽的使用场景2.1 点击事件处理2.2 定时器事件处理2.3 自定义信号槽的应用2.4 多线程编程中的信号槽使用五、qt网络编程1. qt的网络模块介绍1.1 TCP编程1.2 UDP编程1.3 HTTP编程2. qt网络编程实例2.1 客户端/服务器模型的实现 2.2 文件传输应用案例2.3 网络数据采集与展示六、qt数据库编程1. qt的数据库模块介绍1.1 SQL数据库1.2 NoSQL数据库1.3 数据库连接方式2. qt数据库编程实例2.1 数据库的增删改查操作2.2 数据库事务处理2.3 数据库连接池的实现七、qt跨评台开发技巧1. 跨评台编译1.1 编写高度可移植的qt代码 1.2 跨评台兼容性测试1.3 跨评台发布与打包2. 跨评台开发注意事项2.1 界面效果的统一2.2 评台特定功能的处理2.3 跨评台性能优化策略八、qt性能调优与调试技巧1. qt性能调优工具介绍1.1 qt的性能监控工具1.2 qt的性能调优工具2. qt性能调优实践2.1 内存分析和优化2.2 界面渲染优化2.3 事件处理性能优化3. qt调试技巧3.1 调试工具的使用3.2 代码调试技巧3.3 内存泄露排查方法以上就是明王讲授的qt开发笔记大纲,希期对大家学习qt开发有所帮助。
看一下效果很简单的一个小功能先说分部讲一下过程再给出详细代码添加数据MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->tableWidget->setColumnCount(2);ui->tableWidget->setRowCount(2);ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"age");ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置为可以选中单个ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("1"));ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("20"));ui->tableWidget->selectRow(0);}进行增删除修改操作#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->tableWidget->setColumnCount(2);ui->tableWidget->setRowCount(2);ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"age");ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置为可以选中单个ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("1"));ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("20"));ui->tableWidget->selectRow(0);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) {if(previous!=Q_NULLPTR){previous->setBackgroundColor(Qt::transparent);if(current==Q_NULLPTR)return;current->setBackgroundColor(Qt::blue);}void MainWindow::on_btn_Add_clicked(){// QAbstractItemModel *model = ui->tableWidget->model();// model->insertRow(model->rowCount());int cols=ui->tableWidget->columnCount();int rows=ui->tableWidget->rowCount();qDebug()<<rows;ui->tableWidget->insertRow(rows);for(int i=0;i<cols;i++){ui->tableWidget->setItem(rows,i,new QTableWidgetItem("new"+QString::number(rows)));}ui->tableWidget->selectRow(rows);}void MainWindow::on_btn_Del_clicked(){QTableWidgetItem * item = ui->tableWidget->currentItem();if(item==Q_NULLPTR)return;ui->tableWidget->removeRow(item->row());}void MainWindow::on_btn_Modify_clicked(){QModelIndex index = ui->tableWidget->currentIndex();QList<QTableWidgetItem *> listItem = ui->tableWidget->selectedItems();if(listItem.count()==0)return;foreach(QTableWidgetItem * item, listItem) {item->setText("modify");// QTableWidgetItem * item = ui->tableWidget->currentItem();// if(item==Q_NULLPTR)return;// item->setText("modify");}这里有一些对TableWidget的设置说明一下1. 将表格变为禁止编辑在默认情况下,表格里的字符是可以更改的,比如双击一个单元格,就可以修改原来的内容,如果想禁止用户的这种操作,让这个表格对用户只读,可以这样:tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚举中的一个,都是触发修改单元格内容的条件:2. 设置表格为整行选择tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式QAbstractItemView.SelectionBehavior枚举还有如下类型3.单个选中和多个选中的设置:tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置为可以选中多个目标该函数的参数还可以是:QAbstractItemView.NoSelection 不能选择QAbstractItemView.SingleSelection 选中单个目标QAbstractItemView.MultiSelection 选中多个目标QAbstractItemView.ExtendedSelection QAbstractItemView.ContiguousSelection 的区别不明显,主要功能是正常情况下是单选,但按下Ctrl或Shift键后,可以多选对于水平或垂直方法的表头,可以用以下方式进行隐藏/显示的设置:tableWidget->verticalHeader()->setVisible(false); //隐藏列表头tableWidget->horizontalHeader()->setVisible(false); //隐藏行表头5. 对表头文字的字体、颜色进行设置QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //获得水平方向表头的Item对象columnHeaderItem0->setFont(QFont("Helvetica")); //设置字体columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //设置单元格背景颜色columnHeaderItem0->setTextColor(QColor(200,111,30)); //设置文字颜色6. 在单元格里加入控件:QTableWidget不仅允许把文字加到单元格,还允许把控件也放到单元格中。
Ref: /superjoel/article/details/5112120一般来说,Model里面并没有真正存储数据(数据少的话也可以直接存储在Model里),它的数据是从真正的“肉(raw)”里取得,如一个disk file,或database的query result set等等。
那么这个model究竟是干什么用的呢?说白了吧,它就是负责将“肉”数据获取并提供给view,然后将view所做的对“肉”数据的修改更新至真正的“肉”中。
所以,读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了。
有的时候“肉”可能真的很肥,所以model还有一项重要的工作就是把这些“肉”编号。
这样就出现了Model Index这个非常重要的类。
一般来说,它使用一个2维的编号(row/colum)来对“肉”编号。
但对于tree 这种有层次结构的数据来说,又加上一个parent index作为第3个编号。
即一个父亲下面的叶子也是从0,0开始编号,获取model index的时候用递归来实现。
OK,现在model 已经有了一堆编好号码的“肉”了,谁来买啊?“肉”便宜了。
View适时出现,注意,很多view可以同时来买同一块“肉”。
(汗,不开玩笑了,这篇blog快水了)。
当view需要显示某些数据时,它们通过model index从model中获取数据(调用model的data函数,当model的data变化时,它也会自动发dataChanged signal 给所有的view以便它们更新)。
当然,在view中也可以调用model的setData函数来设定某个model index所对应的数据。
这里要说明一下model中的数据,用QVarient来承载,可以是所有Qt支持的类型,比较贴心的是,数据可以分成多个角色(role),例如Qt::DisplayRole专用于显示,Qt::BackgroundRole用于显示背景色等等。
qt综合案例修改用户资料一、整体思路。
1. 首先呢,我们得有个界面,这个界面就像是一个小窗口,用来展示用户当前的资料并且让用户能修改这些资料。
这个界面上要有各种输入框,像用来输入新的用户名的文本框,输入新密码的密码框(如果允许修改密码的话),还有输入用户年龄、联系方式之类信息的文本框。
2. 然后呢,我们要从某个地方把用户当前的资料读取出来并显示在这些输入框里。
这个地方可以是数据库,也可以是本地的一个配置文件。
假设我们这里是从数据库读取,那就得写一些数据库查询的代码。
3. 当用户在这些输入框里修改完资料后,得有个保存或者确认修改的按钮。
用户一点这个按钮,我们就得把输入框里新的资料获取到,然后把这些新资料更新到数据库或者配置文件里,这样用户资料就修改成功啦。
二、代码实现的步骤(简略版)1. 界面设计(使用Qt Designer或者纯代码)在Qt中创建一个新的窗口(比如`QWidget`或者`QDialog`)。
往这个窗口上添加各种标签(`QLabel`)来提示用户每个输入框是干嘛用的,像“用户名:”“年龄:”这样的标签。
添加对应的输入框,比如`QLineEdit`用于普通文本输入(像用户名、年龄等),`QPasswordEdit`用于密码输入(如果有密码修改功能)。
再添加一个“保存”或者“确认修改”按钮(`QPushButton`)。
举个小例子,如果用代码创建一个简单的输入用户名的部分:cpp.QLabel userNameLabel = new QLabel("用户名:");QLineEdit userNameEdit = new QLineEdit;QHBoxLayout userNameLayout = new QHBoxLayout;userNameLayout->addWidget(userNameLabel);userNameLayout->addWidget(userNameEdit);2. 读取用户当前资料并显示。
Qt Model/View 学习笔记 一.介绍Qt 4推出了一组新的Item View类,它们使用Model/view结构来管理数据与表示层的关系。
这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的Model接口,使得更多的数据源可以被这些item view使用。
这里对Model/view的结构进行了描述,结构中的每个组件都进行了解释,给出了一些例子说明了提供的这些类如何使用。
1.1 Model/View结构Model-View-Controller(MVC), 是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。
经典设计模式的著作中有这样的描述:MVC 由三种对象组成。
Model是应用程序对象,View是它的屏幕表示,Controller定义了用户界面如何对用户输入进行响应。
在MVC之前,用户界面设计倾向于三者揉合在一起,MVC对它们进行了解耦,提高了灵活性与重用性。
假如把view与controller结合在一起,结果就是Model/view结构。
这个结构依然是把数据存储与数据表示进行了分离,它与MVC都基于同样的思想,但它更简单一些。
这种分离使得在几个不同的view上显示同一个数据成为可能,也可以重新实现新的view,而不必改变底层的数据结构。
为了更灵活的对用户输入进行处理,引入了delegate这个概念。
它的好处是,数据项的渲染与编程可以进行定制。
如上图所示,Model与数据源通讯,并提供接口给结构中的别的组件使用。
通讯的性质依赖于数据源的种类与Model实现的方式。
view从Model获取Model Indexes,后者是数据项的引用。
通过把Model Indexes提供给Model,view可以从数据源中获取数据。
在标准的views中,delegate会对数据项进行渲染,当某个数据项被选中时,delegate 通过Model Indexes与Model直接进行交流。
总的来说,Model/view 相关类可以被分成上面所提到的三组:Models,views,delegates。
这些组件通过抽象类来定义,它们有着共同的接口,在某些情况下,还提供了缺省的实现。
抽象类意味着需要子类化以提供完整的其他组件希望的功能。
这也允许实现定制的组件。
Models,views,delegates之间通过信号,槽机制来进行通讯:从Model发出的信号通知view数据源中的数据发生了改变。
从view发出的信号提供了有关被显示的数据项与用户交互的信息。
从delegate发生的信号被用于在编辑时通知Model和view关于当前编辑器的状态信息。
1.1.1 Item Models所有的item Models都基于QAbstractItemModel类,这个类定义了用于views和delegates访问数据的接口。
数据本身不必存储在Model,数据可被置于一个数据结构或另外的类,文件,数据库,或别的程序组件中。
关于Model的基本概念在Model Classes部分中描述。
Qt已经实现过的ItemModel如下:1.QAbstractItemModel提供给数据一个接口,它非常灵活,基本满足views的需要,无论数据用以下任何样的形式表现,如tables,lists,trees。
然而,当你重新实现一个Model时,如果它基于table或list形式的数据结构,最好从QAbstractListModel,QAbstractTableModel开始做起,因为它们提供了适当的常规功能的缺省实现。
这些类可以被子类化以支持特殊的定制需求。
子类化Model的过程在Create New Model部分讨论。
QT提供了一些现成的Models用于处理数据项:2.QStringListModel 用于存储简单的QString列表。
3.QStandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据。
4.QDirModel提供本地文件系统中的文件与目录信息。
5.QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用来访问数据库。
假如这些标准Model不满足你的需要,你应该子类化QAbstractItemModel,QAbstractListModel或是QAbstractTableModel来定制。
1.1.2 Views不同的view都完整实现了各自的功能:QListView把数据显示为一个列表,QTableView 把Model 中的数据以table的形式表现,QTreeView 用具有层次结构的列表来显示Model 中的数据。
这些类都基于QAbstractItemView抽象基类,尽管这些类都是现成的,完整的进行了实现,但它们都可以用于子类化以便满足定制需求。
1.1.3 DelegatesQAbstractItemDelegate 是Model/view架构中的用于delegate的抽象基类。
缺省的delegate实现在QItemDelegate类中提供。
它可以用于Qt标准views的缺省 delegate.1.1.4排序在Model/view架构中,有两种方法进行排序,选择哪种方法依赖于你的底层Model。
假如你的Model是可排序的,也就是它重新实现了QAbstractItemModel::sort()函数,QTableView与QTreeView都提供了API,允许你以编程的方式对Model数据进行排序。
另外,你也可以进行交互方式下的排序(例如,允许用户通过点击view表头的方式对数据进行排序),可以这样做:把QHeaderView::sectionClicked()信号与QTableView::sortByColum()槽或QTreeView::sortByColumn()槽进行联结就好了。
另一种方法是,假如你的Model没有提供需要的接口或是你想用list view表示数据,可以用一个代理Model在用view表示数据之前对你的Model数据结构进行转换。
1.1.5 便利类许多便利类都源于标准的view类,它们方便了那些使用Qt中基于项的view与table类,它们不应该被子类化,它们只是为Qt 3的等价类提供一个熟悉的接口。
这些类有QListWidget,QTreeWidget,QTableWidget,它们提供了如Qt 3中的QListBox, QlistView,QTable 相似的行为。
这些类比View类缺少灵活性,不能用于任意的Models,推介使用Model/view的方法处理数据。
1.2用法简介Qt提供了两个标准的Models:QStandardItemModel和QDirModel。
QStandardItemModel是一个多用途的Model,可用于表示list,table,tree views所需要的各种不同的数据结构。
这个Model也持有数据。
QDirModel维护相关的目录内容的信息,它本身不持有数据,仅是对本地文件系统中的文件与目录的描述。
QDirModel是一个现成的Model,很容易进行配置以用于现存的数据,使用这个Model,可以很好地展示如何给一个现成的view设定Model,研究如何用Model Indexes来操纵数据。
QListView与QTreeView很适合与QDirModel搭配。
下面的例子在tree view与list view显示了相同的信息,QDirModel提供了目录内容数据。
这两个Views共享用户选择,因此每个被选择的项在每个view中都会被高亮。
先装配出一个QDirModel以供使用,再创建views去显示目录的内容。
这给我展示了使用Model的最简单的方式。
Model的创建与使用都在main()函数中完成:int main(int argc,char*argv[]){QApplication app(argc,argv);QSplitter*splitter=new QSplitter;QDirModel*Model=new QDirModel;//从缺省目录创建数据QTreeView*tree=new QTreeView(splitter);tree->setModel(Model);tree->setRootIndex(Model->Index(QDir::currentPath()));QListView*list=new QListView(splitter);list->setModel(Model);list->setRootIndex(Model->Index(QDir::currentPath()));//配置一个view去显示Model中的数据,只需要简单地调用setModel(),并把目录Model作为参数传递//setRootIndex()告诉views显示哪个目录的信息,这需要提供一个Model Index,然后用这个//Model Index去Model中去获取数据//Index()这个函数是QDirModel特有的,通过把一个目录做为参数,得到了需要的Model Index//其他的代码只是窗口show出来,进入程序的事件循环就好了splitter->setWindowTitle("Two views onto the same directory Model");splitter->show();return app.exec();}上面的例子并没有展示如何处理数据项的选择,这包括很多细节,以后会提到。
二.Model类2.1基本概念在Model/view构架中,Model为view和delegates使用数据提供了标准接口。
在Qt 中,标准接口QAbstractItemModel类中被定义。
不管数据在底层以何种数据结构存储,QAabstractItemModel的子类会以层次结构的形式来表示数据,结构中包含了数据项表。
我们按这种约定来访问Model中的数据项,但这个约定不会对如何显示这些数据有任何限制。
数据发生改变时,Model通过信号槽机制来通知关联的views。
如下图所示:2.2 Model Indexes为了使数据存储与数据访问分开,引入了Model Index的概念。
通过Model Index,可以引用Model中的数据项,Views和delegates都使用Indexes来访问数据项,然后再显示出来。
因此,只有Model需要了解如何获取数据,被Model管理的数据类型可以非常广泛地被定义。