《C++.GUI.Programming.with.Qt.4》读书笔记Chapter 9~10

Chapter 9 Drag and Drop

Section 1 .Enabling Drag and Drop

    默认情况下,QTextEdit这个widget是接受来自于其他程序的文本拖拽的;如果用户将一个文件拖拽至其上,它会将文件名插入显示文本。可以调用setAcceptDrops()来允许或禁止接受拖拽。



    dragEnterEvent() ,该函数在用户将一个对象托(drag)至widget之上时被调用,参数为QDragEnterEvnet型指针。
    默认情况下,widget不接受用户的拖拽行为;若对该指针调用acceptProposedAction(),则是告知Qt允许该widget接受用户的拖拽行为,Qt会通过改变鼠标形状来提示用户。


    MIME 类型的表示方式: type/subtype

    dropEvent() ,该函数在用户将一个对象拽(drop)至widget之上时被调用,参数为QDropEvent型指针

    QWidget类还提供了dragMoveMent()和dragLeaveEvent()这两个函数,但对于大多数应用而言不需要对其进行再实现。


    mousePressEvent(): 鼠标被按下时该函数被调用

    mouseMoveEvent() :鼠标保持按下的状态且移动时,该函数被调用。

    QDrag类使用QMimeData类来存储与拖拽操作相关的信息。

    QDrag:start()

    在有QDragEnterEvent事件发生时,调用QDragEnterEvent()::source()函数,如果拖拽动作起始的那个widget与接受widget属于同一个程序,那么该函数返回指向源widget的指针,否则返回空指针。

   
Section 2 .Section Custom Drag Types

    可以从以下三种机制中进行选择:

    1.在源这一边调用QMimeData::setData(),将信息存储在QByteArray中,而在接受者这一方,调用QMimeData::data()将信息提取出来。

    2. 对QMimeData进行派生,在子类中对formats()和retrieveData()这两个函数进行重新实现,来处理自定义数据。

    3. 如果拖拽动作发生在一个应用程序的内部,那么可以对QMimeData进行派生,将信息存储在该子类中。

    QMimeData::formats()函数返回其支持的MIME类型列表。

    QMimeData::retrieveData()函数将某个指定MIME类型的数据以QVariant的形式返回。

    QMimeData所提供的text(),html(),urls(),data()等接口函数,都是依靠retrieveData()来完成底层操作的。

Section 3. Clipboadr Handling

    Qt中通过QApplication::clipboare()来获得对QClipboard的指针。对系统clipboard的写操作通过setText(),setImage或setPixmap()完成,而读操作则通过text(),image()和pixmap()来完成。

    QClipboard::setMimeData()
    QClipboard::MimeData()
   
    QClipboard::supportsSelection() 在X11平台下返回true,其他环境下返回fasle。

    如果希望每当clipboard中的内容发生变动时收到通知,可以利用Qt提供的QClipboard::dataChanged()这个slot


Chapter 10    Item View Classes

    MVC机制:Model-View-Controller(源自smalltalk)

    Qt中提供一种模仿MVC的model/viewer机制。

    Qt中的delegate这个抽象概念与Controller略微不同,它负责为item的生成和编辑提供良好的控制。   
   
    Qt为每种类型的view都提供了默认的delegate,这对于大多数应用程序已经足够了,通常情况下程序员不需要考虑delegatd的问题。

    可以为一个model注册两个或更多的view,Qt自动保持多个view之间数据的同步和一致性,当数据在某个view中被修改后,会自动在其他相关view中反映出来。

    大多数情况下,程序向用户提供的item的数量并不庞大,因此可以简单的使用Qt内置的item view clas(QListWidget,QTableWidget和QtreeView),而没有必要使用Qt提供的model/view 机制。但对于成员数量很大的数据集,采用model/view机制则是明智的选择。   


Section 1 Using Item View Convenience Classes

QListWidget

    QListWidget中包含多个roles,每个都与一个QVariant变量相关联。最常用的roles包括Qt::DisplayRole,Qt::EditRole,Qt::IconRole
对于上述role,Qt都提供了方便的接口函数用于读写数据。程序员还可以对role进行自定义,通过Qt::UserRole或更大的数值进行标识。

    默认情况下QListWidget是只读的,因此需要调用QAbstractItemView::setEditTriggers(),为其设定能引发编辑操作的动作

QTableWidget

    默认情况下,QTableWidget是允许编辑的,可以调用QAbstractItemView::setEditTriggers(QAbstractItemView::NoEditTriggers)来禁止编辑。

QtreeWidget

    默认情况下,QtreeWidget是只读的

    QSetting中的group在概念上类似于文件系统中的目录
   
Section 2 Using Predefined Models

    Qt提供的预定义model有以下几种:

    QStringListModel            存储一组字符串
    QStandardItemModel        存储任意层次结构的数据
    QDirModel                对文件系统进行封装
    QSqlQueryModel            对SQL的查询结果集进行封装
    QSqlTableModel            对SQL中的table进行封装
    QSqlRelationalTableModel        对带有foreign key的SQL table进行封装
    QSortFilterProxyModel        对另一个model执行sort and/or filter

    model中存放的每项数据都有相应的"model index",由QModelIndex类来表示。

    每个index由三个部分构成:row,column和表明所属model的指针。

    对于一维的list model,clumn部分永远为0
   
    在model/view 机制中,对数据的操作都是通过model执行的,而model负责保证在数据发生变动时view自动更新。

    QDirModle:mkdir()——创建文件夹的工作可以通过QDir类来完成,不过QDirModel提供了工作于QModelIndex之上的更方便的函数。
   
    不同于其它model,QSortFilterProxyModel对一个已有的model进行封装,并完成数据在底层modle和view之间的传递。

    setSourceModel()


Section 3 . Implementing Custom Models

    model中的每项数据都有对应的index和一组称为“role”的属性,其中最常用的有Qt::DisplayRole和Qt::EditRole。

    对于list和table这两类model,其中每个元素的parent都是root,即表示为一个invalid QModelIndex。

    而对于tree model,某些元素的parent为root,而有些元素的parent为model中的其它元素。

    Qt中提供了几种model 基类,包括 QAbstractListModel,QAbstractTableModel和QAbstractItemModel ,其中QAbstractItemModel是另外两者的基类,用于支持范围很广的modles,包括具备递归层次结构的;而QAbstractListModel用于支持一维数据集,QAbstractTableModel用于支持二维数据集。

    实际上,要创建只读的自定义model的话,并不是件困难的事情。

    要自定义只读的table model的话, 需要重新实现rowCount(),columnCount()和data()这三个函数。

    createIndex() ,该函数用于创建并返回一个model index

    flags(),该函数被model用于表示可以对数据执行的操作(例如,是否可编辑),从QAbstractTableModel继承而来的默认实现是返回Qt::ItemSelectable | Qt::ItemIsEnabled

    qDeleteALl(),该函数对一个含有指针的容器进行迭代,并对其中每个指针元素执行delete操作。

Section 4 Implementing Custom Delegates

    view中的每个item是由delegate负责显式和编辑的,在大多数情况下,view默认的delegate足够满足用户需求。
   
    setItemDelegate() ,该函数为view指定其delegate。

    QItemDelegate & QAbstractItemDelegate

    要提供一个允许编辑的自定义delegate,我们必须对createEditor(),setEditorData(),setModelData()进行重新实现,而且还必须重新实现paint()以改变item的显示。

    QTimeEdit & QTime
   
    当用户开始编辑操作时,view会调用createEditor()来创建一个Editor,然后调用setEditorData()来用item的当前值对Editor进行初始化。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值