模型视图结构_第1页
模型视图结构_第2页
模型视图结构_第3页
模型视图结构_第4页
模型视图结构_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1/1模型视图结构Qt之模型/视图

(2014-01-0815:48:01)

转载▼

标签:

分类:Qt

qt

qt使用mvc

qtableview

qlistview

qtreeview

关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程

(Model/ViewProgramming)讲解的很清晰。

Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户。这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中。

模型-视图-控制器(MVC)是一种设计模式,由三类对象组成:

?模型:应用程序对象。

?视图:屏幕演示。

?控制器:定义了用户界面响应用户输入的方式。

在引入MVC之前,用户界面的设计往往是将这些对象组合在一起。MVC的解耦带来了灵活性和重用性。

如果视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了数据与呈现给用户的方式,但提供了基于相同原理的简单框架。这种分离使得它可以在几个不同的视图中显示相同的数据,并且实现新类型的视图,

而无需改变底层的数据结构。为了灵活地处理用户输入,则引入了委托的概念。在此框架引入委托的优点是:它允许项目数据显示和自定义编辑。

模型/视图结构

模型与数据源进行通信,在这个体系结构中为其它组件提供了一个接口。通信的性质依赖于数据源的类型以及模型的实现方式。

视图从模型中得到模型索引,这些都引用到数据项。通过为模型提供模型索引,视图可以从数据源中检索数据项。

在标准的视图里,委托呈现数据项目。当一个项目被编辑,委托与模型直接利用模型索引进行通信。

模型/视图/委托通信

模型、视图、委托使用信号和槽相互通信:

?模型的信号:通知视图关于改变由数据源保持的数据。

?视图的信号:提供了关于用户交互显示的项目信息。

?委托的信号:当编辑时告诉模型和视图编辑器的状态。

模型

所有的模型都基于QAbstractItemModel类。这个类定义了一个使用视图和委托来访问数据的接口。数据本身不是必须要存储在模型中,可以在一个数据结构或一个单独的类、文件、数据库、或其它一些应用组件。

QAbstractItemModel为数据提供了一个接口,它足够的灵活性来处理表格、列表、树形式的数据视图。然而,实现新的列表和类似于表的数据结构模型时,QAbstractListModel和QAbstractTableModel类是更好的起点,因为它们提供了适当的常用的功能的默认实现。这些类可以派生子类,用来提供支持特定种类的列表和表格的模型。

Qt提供了一些现成的模型,可以用来处理数据项:

?QStringListModel:用于存储简单的QString的列表项。

?QStandardItemModel:管理更复杂的树结构件,其中每一个项目可以包含任意数据。

?QFileSystemModel:提供有关本地文件系统的文件和目录信息。

?QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:使用模型/视图约定来访问数据库。

如果这些标准模型不能满足要求,则可以继承化QAbstractItemModel、QAbstractListModel或QAbstractTableModel来创建自定义模型。

视图

提供了完整的实现为各种不同的视图:而QListView显示项目列表,QTableView中从一个表模型中显示数据,QTreeView则显示了层次列表的

数据模型项目。每个类是基于QAbstractItemView抽象基类。虽然这些类是准备使用的实现,他们也可以被子类化,以提供自定义的视图。

委托

QAbstractItemDelegate在模型/视图框架中代表抽象的基类。默认的委托实现由QStyledItemDelegate提供,这被Qt的标准视图用作默认的委托。然而,QStyledItemDelegate和QItemDelegate独立替代绘画,且为视图项提供编辑器。它们之间的区别在于QStyledItemDelegate使用当前样式来绘制项目。因此,建议实现自定义委托或当与Qt样式表一起使用时,使用QStyledItemDelegate作为基类。

排序

在模型/视图结构中有两种接近的排序方式,选择哪种方式取决于你的基础模型。

如果你的模型是可排序的,也就是说,如果重新实现了QAbstractItemModel::sort()方法,QTableView和QTreeView都提供了一个API,允许以编程方式排序来排序模型数据。此外,可以启用交互式排序(即允许用户将数据通过单击视图的标题进行排序),由QHeaderView::sortIndicatorChanged()信号分别连接到QTableView::sortByColumn()槽或QTreeView::sortByColumn()槽。

另一种方法,如果模型没有所需的接口,或者如果想使用一个列表视图来显示数据,使用代理模型呈现数据视图之前应转换模型的结构。

方便的类

一些便利类都源于标准视图类的依赖Qt的项目为基础的项目视图和表类应用的好处。他们不打算被继承。

这些类的实例包括QListWidget,QTreeWidget和QTableWidget。

这些类比视图类灵活性差,且不能与任意的模型使用。建议使用模型/视图的方法来处理在项目视图中的数据,除非强烈需要一个基于项目的类。

如果想利用模型/视图提供的特性方法,同时使用一个基于项目的接口,可以考虑使用视图类,例如:QListView、QTableView、QTreeView与QStandardItemModel。

使用视图与现有的模型

QListView和QTreeView类是最合适的视图来使用QFileSystemModel。下面介绍的示例在树视图中显示一个目录,旁边列表视图中显示相同的信息。该视图共享用户的选择,这样选择的项目在两个视图中高亮显示。

代码如下:

intmain(intargc,char*argv[])

{

QApplicationapp(argc,argv);

QSplitter*splitter=newQSplitter;

QFileSystemModel*model=newQFileSystemModel;

model->setRootPath(QDir::currentPath());

QTreeView*tree=newQTreeView(splitter);

tree->setModel(model);

tree->setRootIndex(model->index(QDir::currentPath()));

QListView*list=newQListView(splitter);

list->setModel(model);

list->setRootIndex(model->index(QDir::currentPath()));

splitter->setWindowTitle("Twoviewsontothesamefilesystemmodel");

splitter->show();

returnapp.exec();

}

上面的例子中,我们忽略提及如何处理选择的项目。下面将详细讲述在视图中处理所选的项目。

基本概念

在模型/视图结构中,模型提供了视图与委托访问数据的标准接口。在Qt中,标准的接口由QAbstractItemModel类定义。无论多么数据项被存储在任何底层的数据结构中,QAbstractItemModel的所有子类所代表的数据作为包含视图项的分层结构。视图使用这个约定来访问模型中的数据项,但并不限制将该信息传达给用户的方式。

Modelindexes

为确保数据被分开被访问,模型索引的概念被引入。可以通过模型索引来获得每条信息。视图与委托使用这些索引来请求显示的数据项。

因此,模型只需要知道如何获取数据,并通过模型管理的数据的类型可以被相当普遍定义。型号索引包含一个指向创建它们的模型的指针,在处理多个模型时可以防止混乱。

QAbstractItemModel*model=index.model();

模型索引提供临时参考信息,并且可以用于通过模型来检索或修改数据。由于模型可能重组其内部结构,模型的索引可能会变得无效,不宜存储。如果需要长期参考一条信息,必须创建一个持久性模型索引。这为模型保持最新信息提供了一个参考。临时模型索引由QModelIndex类提供,持久性模型索引由QPersistentModelIndex类提供。

取得对应于数据项的模型索引,模型中必须制定三个属性:一个行号、一个列号,以及父项的模型索引。

行和列

在最基本的形式中,模型可以被一个简单的表访问,表项位于行号和列号,这并不意味着底层数据存储在数据结构中,使用行号和列号只是一个惯例,以允许组件相互通信。我们可以通过指定行号和列号的模型索引有关的任何特定信息,通过下面的方式得到项目的索引:

QModelIndexindex=model->index(row,column,...);

模型提供的接口简单,单级的数据结构如列表和表格不需要提供任何其他信息。但是,正如上面的代码所示,当获得一个模型索引时,我们需要提供更多的信息。

行和列

图中显示了一个基本的表模型,其中的每个项目的位置由一对行号和列号表示。我们通过模型索引(一个项目数据)行号和列号来获取。

QModelIndexindexA=model->index(0,0,QModelIndex());

QModelIndexindexB=model->index(1,1,QModelIndex());

QModelIndexindexC=model->index(2,1,QModelIndex());

父节点

由模型提供的类似于表的接口给数据项是理想的当在表格或列表视图中使用数据,行号和列号准确地映射到视图显示项目的方式。然而,结构,如树视图需要更模型为项目暴露一个更灵活的接口。因此,每个项目也可以是另一个表的父项,大致相同的方式,在一个树视图中的顶级项目可以包含另一个列表项。

当请求的一个模型项的索引时,必须提供有关该项目的父项目的一些信息。在模型外,指定一个项目的唯一途径是通过一个模型索引,所以父模型索引也必须如下给出:

QModelIndexindex=model->index(row,column,parent);

父项,行和列

该图显示了一个树模型,其中每个项目都依赖于由一个父项,一个行号和一个列号。

项目的“A”和“C”表示模型顶层的兄弟姐妹:

项目“A”有很多孩子,可以通过如下方式由“A”索引得到“B”索引:QModelIndexindexB=model->index(1,0,indexA);

QModelIndexindexA=model->index(0,0,QModelIndex());

QModelIndexindexC=model->index(2,1,QModelIndex());

项目角色

模型中的项目可以为其他组件演绎不同的角色,允许为不同的情况提供不同类型的数据。例如,Qt::DisplayRole可以在用于访问视图中被显示为文本的字符串。通常情况下,包含数据的项目用于若干不同的角色,且标准角色被Qt::ItemDataRole定义。

我们可以通过模型索引传递给相应的项目向模型请求项目数据,并通过指定一个角色来获取想要的数据类型,如下:

QVariantvalue=model->data(index,role);

数据类型被称为模型的角色指示器。视图可以以不同的方式显示角色,因此,为每个角色提供相应的信息非常重要。

项目数据最常见的用途是覆盖在Qt::ItemDataRole中定义的标准角色。通过为每个角色提供相应的项目数据,模型可以为视图和委托提供有关项目应如何呈现给用户的指示,不同的视图可以根据需要来解释或忽略此信息。此外,也可以为应用程序的特定目的而定义附加的角色。

使用模型索引

为了演示如何将数据从一个模型中进行检索,使用模型索引,我们创建了一个QFileSystemModel,在窗体上没有视图以及显示文件和目录的名称。虽然这并不是使用模型的正常方式,它表明模型在处理模型索引上的约定。

我们用以下述方式构建了一个文件系统模型:

QFileSystemModel*model=newQFileSystemModel;

QModelIndexparentIndex=model->index(QDir::currentPath());

intnumRows=model->rowCount(parentIndex);

在这种情况下,我们设置了一个默认QFileSystemModel,由该模型使用index()的特定实现来获取父索引,使用rowCount()函数来计算行号。

为简单起见,我们只关心模型中的第一列中的项目。我们检查每一行,依次获取每一行中的第一个项目的模型索引,以及读出所存储在该模型项目中的数据。

for(introw=0;rowindex(row,0,parentIndex);

为了获得一个模型索引,我们指定了行号、列号(第一列为零),以及所有我们想要的项目的父项目的模型索引。每个项目中的文本检索可以使用模型的

data()函数来获取。我们指定了模型索引和Qt::DisplayRole来获取数据项中的字符串。

QStringtext=model->data(index,Qt::DisplayRole).toString();

//Displaythetextinawidget.

}

使用模型

我们创建一个字符串列表模型作为例子,设置一些数据,并构造一个视图来显示模型的内容。这都可以在一个单一的函数执行:

intmain(intargc,char*argv[])

{

QApplicationapp(argc,argv);

QStringListnumbers;

numberssetModel(model);

视图正常显示方式

view->show();

returnapp.exec();

}

视图展现模型的内容,通过模型的接口访问数据。当用户试图编辑一个项目时,视图使用缺省代表提供一个编辑器部件。

上面的图显示QListView如何使用字符串列表模型表示数据。由于模型可编辑,视图会自动允许列表中的每个项目使用默认的委托进行编辑。

一个模型的多个视图

一个模型可以为多个视图所使用。在下面的代码中,我们创建两个表视图,使用的均是创建好的同一个模型。

QTableView*firstTableView=newQTableView;

QTableView*secondTableView=newQTableView;

firstTableView->setModel(model);

secondTableView->setModel(model);

在模型/视图框架中使用信号和槽是指更改模型可以传递给所有相连的视图,以确保始终可以访问相同的数据,而不管所使用的视图。

上面的图显示了统一模型的两种不同的视图,每个都包含了一些选定的项目。尽管模型中的数据在视图显示一致,每个视图维护它自己的内部选择模型。这在某些情况下有用,但对于许多应用来说,则需要一个共享的选择模型。

视图共享选择

虽然视图类提供自己的默认选择模型很方便,但当我们使用多个视图到同一个模型时,通常需要所有的模型数据和用户的选择在所有视图显示一致。由于视图类允许其内部选择模型进行更换,那么可以使用如下方式实现视图之间的统一:

secondTableView->setSelectionModel(firstTableView->selectionModel());

第二个视图给出了第一个视图的选择模型。这两种视图现在在同一个选择模型进行操作,保持了数据和所选项目的同步。

Qt之模型/视图(委托)

(2014-01-0913:58:09)

转载▼

分类:Qt

标签:

qt

qt委托

qlistview委托

qtableview委托

qtreeview委托

概念

不同于模型-视图-控制器模式,模型/视图设计不包括用于管理与用户交互的一个完全独立的组件。一般情况,视图负责将模型数据呈现给用户以及处理用户输入。为了输入更加具有灵活性,则由委托来执行交互。这些组件提供输入功能,且在一些视图中还负责渲染个别项目。控制委托的标准接口在QAbstractItemDelegate类中定义。

委托能够通过实现的paint()和sizeHint()函数来展示它们的内容。然而,简单基础部件的委托可以继承QItemDelegate而不是QAbstractItemDelegate,并使用这些函数的默认实现。

委托编辑器可以通过使用小工具来管理编辑过程或直接处理事件来实现。

使用现有委托

Qt提供的标准视图中使用QItemDelegate提供编辑功能。委托接口的默认实现以一贯风格来呈现项目为每个标准视图:QListView、QTableView、QTreeView。

所有标准角色由所使用的标准视图中的默认委托处理。

视图使用委托是由itemDelegate()函数返回。setItemDelegate()函数允许你为标准视图设定一个自定义委托,为自定义视图设定委托时,有必要使用此功能。

一个简单的委托

这里实现的委托使用QSpinBox来提供编辑功能,主要用于模型处理整数。虽然为了这个目的我们设置了一个自定义的基于整数的表模型,我们可以很容易地使用QStandardItemModel来代替,因为自定义委托控制数据输入。我们构造了一个表视图来显示模型的内容,可以使用自定义的委托来进行编辑。

我们的委托继承于QItemDelegate,因为我们不想编写自定义显示功能。然而,仍然必须提供管理编辑器窗口小部件的功能:

classSpinBoxDelegate:publicQStyledItemDelegate

{

Q_OBJECT

public:

SpinBoxDelegate(QObject*parent=0);

QWidget*createEditor(QWidget*parent,constQStyleOptionViewItem

voidsetEditorData(QWidget*editor,constQModelIndexvoidsetModelData(QWidget*editor,QAbstractItemModel*model,

constQModelIndex

voidupdateEditorGeometry(QWidget*editor,

constQStyleOptionViewItem};

提供了一个编辑器

在这个例子中,当表视图需要提供一个编辑器时,它将要求委托提供一个编辑器部件适用于修改该项目。createEditor()函数提供一切,委托需要能够建立一个合适的窗口小部件:

QWidget*SpinBoxDelegate::createEditor(QWidget*parent,

constQStyleOptionViewItem&,

constQModelIndex

editor->setFrame(false);

editor->setMinimum(0);

editor->setMaximum(100);

returneditor;}

注意,我们不需要一个指向编辑器的部件,因为当不再需要时,视图负责销毁它。

在编辑器上安装代理的默认事件过滤器,以确保它提供了用户所期望的标准编辑快捷方式。编辑器中可以添加额外的快捷键,以允许更复杂的行为。

可以根据视图提供的模型索引创建不同的编辑器。例如,如果有一个整数列和字符串列,我们可以返回一个QSpinBox或QLineEdit,这取决于哪一列正在被编辑。

委托必须提供一个函数将模型中的数据复制到编辑器中。在这个例子中,我们读出存储在显示角色中的数据,并在QSpinBox中设置的值相应。

voidSpinBoxDelegate::setEditorData(QWidget*editor,

constQModelIndex

QSpinBox*spinBox=static_castQSpinBox*>(editor);

spinBox->interpretText();

intvalue=spinBox->value();

model->setData(index,value,Qt::EditRole);

}

由于视图为委托管理编辑器部件,所以只需要以编辑器提供的内容来更新模型。在这种情况下,我们确QSpinBox是最新更新,并使用指定的索引包含的值来更新模型。

标准的QItemDelegate类通过发射closeEditor()信号来完成编辑视图。视图可确保编辑器部件被关闭和销毁。在这个例子中,我们只提供简单的编辑功能,所以我们需要永远不会发出这个信号。

所有的数据操作通过QAbstractItemModel提供的接口执行。这使得委托大多独立于它操纵的数据的类型,但为了使用某些类型的编辑器部件,则必须做出一些假设。在这个例子中,我们假设模型总是包含整数值,但我们仍然在不同类型的模型中使用此委托,因为的QVariant为意想不到的数据提供了合理的默认值。

更新编辑器的几何形状

管理编辑器的几何形状是委托的责任。当编辑器被创建,或者当项目视图的的位置、大小在视图中改变时,几何形状必须被设置。幸运的是,视图提供了视图选项物体内部所有必要的几何信息。

voidSpinBoxDelegate::updateEditorGeometry(QWidget*editor,constQStyleOptionViewItem

}

这种情况下,我们仅在项目区域中使用视图选项提供的位置信息。使用一些元素展现项目的委托不会直接使用该项目矩形。根据这个项目中的其他元素来设定编辑器的位置。

intmain(intargc,char*argv[])

{

QApplicationapp(argc,argv);

QStandardItemModelmodel(4,2);

QTableViewtableView;

tableView.setModel(

SpinBoxDelegatedelegate;

tableView.setItemDelegate(

tableView.horizontalHeader()->setStretchLastSection(true);

for(introw=0;row2;++column){

QModelIndexindex=model.index(row,column,QModelIndex());model.setData(index,QVariant((row+1)*(column+1)));

}

}

tableView.setWindowTitle(QObject::tr("SpinBoxDelegate"));

tableView.show();

returnapp.exec();

}

Qt之模型/视图(实时更新数据)

(2014-01-0915:59:48)

转载▼

分类:Qt

标签:

qt

mvc

模型/视图

qt进度条

it

上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧!

在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!

功能:

(1)添加委托(进度条)

(2)显示文件名称、大小、进度、速度、剩余时间、状态等。

(3)可进行添加、更新、删除、清空等操作。

(4)实时更新数据

先看一个效果图:

委托(进度条):

ProgressBarDelegate::ProgressBarDelegate(QObject*parent)

:QItemDelegate(parent)

{

}

voidProgressBarDelegate::paint(QPainter*painter,constQStyleOptionViewItemQStyleOptionProgressBarV2progressBarOption;

progressBarOption.state=QStyle::State_Enabled;

progressBarOption.direction=QApplication::layoutDirection();

progressBarOption.rect=option.rect;

progressBarOption.fontMetrics=QApplication::fontMetrics();

progressBarOption.minimum=0;

progressBarOption.maximum=100;

progressBarOption.textAlignment=Qt::AlignCenter;

progressBarOption.textVisible=true;

progressBarOgress=progress;

progressBarOption.text=

QString("%1%").arg(progressBarOgress);

QApplication::style()->drawControl(QStyle::CE_ProgressBar,

}else{

returnQItemDelegate::paint(painter,option,index);

}

}

模型:

TableModel::TableModel(QObject*parent)

:QAbstractTableModel(parent),arr_row_list(NULL)

{

}

TableModel::~TableModel(void)

{

arr_row_list=NULL;

}

voidTableModel::setHorizontalHeaderList(QStringListhorizontalHeaderList){

horizontal_header_list=horizontalHeaderList;

}

voidTableModel::setVerticalHeaderList(QStringListverticalHeaderList)

{

vertical_header_list=verticalHeaderList;

}

intTableModel::rowCount(constQModelIndex

if(NULL==arr_row_list)

return0;

else

returnarr_row_list->size();

}

intTableModel::columnCount(constQModelIndex

if(NULL==arr_row_list)

return0;

elseif(arr_row_list->size()size()=arr_row_list->size())

returnQVariant();

if(index.column()>=arr_row_list->at(0).size())

returnQVariant();

returnarr_row_list->at(index.row()).at(index.column());

}

returnQVariant();

}

QVariantTableModel::headerData(intsection,Qt::Orientationorientation,introle)const

{

if(role==Qt::DisplayRole)

{

if(orientation==Qt::Horizontal)//水平表头

{

if(horizontal_header_list.size()>section)

returnhorizontal_header_list[section];

else

returnQVariant();

}

else

{

if(vertical_header_list.size()>section)

returnvertical_header_list[section];//垂直表头

else

returnQVariant();

}

}

returnQVariant();

}

Qt::ItemFlagsTableModel::flags(constQModelIndex

Qt::ItemFlagsflag=QAbstractItemModel::flags(index);

//flag|=Qt::ItemIsEditable//设置单元格可编辑,此处解释,单元格无法被编辑

returnflag;

}

voidTableModel::setModalDatas(QListrowCount(QModelIndex()));

}

视图:

TableView::TableView(QWidget*parent)

:QTableView(parent)

{

this->setAlternatingRowColors(true);

this->setStyleSheet("QTableView{background-color:rgb(250,250,115);""alternate-background-color:rgb(141,163,215);}");

this->setSelectionBehavior(QAbstractItemView::SelectRows);

this->horizontalHeader()->setStretchLastSection(true);

this->horizontalHeader()->setHighlightSections(false);

this->verticalHeader()->setVisible(false);

this->setShowGrid(false);

this->setEditTriggers(QAbstractItemView::NoEditTriggers);

this->setSelectionMode(QAbstractItemView::ExtendedSelection);

model=newTableModel();

this->setModel(model);

this->initHeader();

model->setModalDatas(

progressbar_delegate=newProgressBarDelegate();

this->setItemDelegate(progressbar_delegate);

connect(model,

this->initHeader();

}

TableView::~TableView(void)

{

if(progressbar_delegate){

deleteprogressbar_delegate;

progressbar_delegate=NULL;

}

if(model){

deletemodel;

model=NULL;

}

grid_data_list.clear();

}

voidTableView::addRow(QStringListrowList)

{

grid_data_list.append(rowList);

model->refrushModel();

}

voidTableView::remove()

{

QModelIndexListmodel_index_list=this->selectedIndexes();intmodel_count=model_index_list.count();

if(model_count=0;i--)

{

grid_data_list.removeAt(list_row.at(i));

}

model->refrushModel();

}

voidTableView::clear()

{

grid_data_list.clear();

model->refrushModel();

}

intTableView::rowCount()

{

returnmodel->rowCount(QModelIndex());

}

voidTableView::initHeader()

{

QStringListheader;

headerrowCount();

if(row_countrefrushModel();

}

完整的工程(源码)下载地址:

http://./doc/4a1be5cd0029bd64793e2c3d.html/detail/u011012932/6829783。

Qt之模型/视图(自定义风格)

(2014-01-0916:58:10)

转载▼

分类:Qt

标签:

qt

模型/视图

qt模型视图

qt进度条

qt委托进度条

关于自定义风格是针对视图与委托而言的,使用事件与QSS都可以进行处理,今天关于美化的细节讲解一下。

先看下图:

先撇开界面的美观性(萝卜青菜,各有所爱),就现有的这些风格,使用QSS+Qt二维绘图已经绰绰有余了。当然,如何让界面更美观,这个没有什么捷径,我只能说一句:无他,唯手熟尔!基本功搞扎实了,实现起来就会游刃有余。。。

voidDetailProgressBar::paint(QPainter*painter,constQStyleOptionViewItem

if(view_option.state

}

QStyledItemDelegate::paint(painter,view_option,index);

if(index.column()==1){

constQAbstractItemMod

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论