??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品久久久久一区二区三区,久久精品青青草原伊人,国产精品狼人久久久久影院 http://www.shnenglu.com/yuanyajie/category/3943.html记录所思所惻I收藏所见所闻�? zh-cnTue, 20 May 2008 02:51:40 GMTTue, 20 May 2008 02:51:40 GMT60q是关QSettings的,把我的问题重复一?/title><link>http://www.shnenglu.com/yuanyajie/archive/2007/10/26/35276.html</link><dc:creator>清源游民</dc:creator><author>清源游民</author><pubDate>Fri, 26 Oct 2007 15:48:00 GMT</pubDate><guid>http://www.shnenglu.com/yuanyajie/archive/2007/10/26/35276.html</guid><wfw:comment>http://www.shnenglu.com/yuanyajie/comments/35276.html</wfw:comment><comments>http://www.shnenglu.com/yuanyajie/archive/2007/10/26/35276.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/yuanyajie/comments/commentRss/35276.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yuanyajie/services/trackbacks/35276.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/yuanyajie/archive/2007/10/26/35276.html'>阅读全文</a><img src ="http://www.shnenglu.com/yuanyajie/aggbug/35276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yuanyajie/" target="_blank">清源游民</a> 2007-10-26 23:48 <a href="http://www.shnenglu.com/yuanyajie/archive/2007/10/26/35276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Qt的进来帮忙解决下有关QSettings中写入中文的问题http://www.shnenglu.com/yuanyajie/archive/2007/10/26/35188.html清源游民清源游民Thu, 25 Oct 2007 19:16:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/10/26/35188.htmlhttp://www.shnenglu.com/yuanyajie/comments/35188.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/10/26/35188.html#Feedback6http://www.shnenglu.com/yuanyajie/comments/commentRss/35188.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/35188.html阅读全文

清源游民 2007-10-26 03:16 发表评论
]]>
Connecting Signals to QtScript Functions(?http://www.shnenglu.com/yuanyajie/archive/2007/10/07/33666.html清源游民清源游民Sat, 06 Oct 2007 16:20:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/10/07/33666.htmlhttp://www.shnenglu.com/yuanyajie/comments/33666.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/10/07/33666.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/33666.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/33666.html阅读全文

清源游民 2007-10-07 00:20 发表评论
]]>
Say hello to QtScript!(?http://www.shnenglu.com/yuanyajie/archive/2007/10/07/33665.html清源游民清源游民Sat, 06 Oct 2007 16:17:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/10/07/33665.htmlhttp://www.shnenglu.com/yuanyajie/comments/33665.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/10/07/33665.html#Feedback3http://www.shnenglu.com/yuanyajie/comments/commentRss/33665.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/33665.html阅读全文

清源游民 2007-10-07 00:17 发表评论
]]>
QT的Graphics View柜架(3/3) http://www.shnenglu.com/yuanyajie/archive/2007/09/27/32962.html清源游民清源游民Wed, 26 Sep 2007 16:09:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/09/27/32962.htmlhttp://www.shnenglu.com/yuanyajie/comments/32962.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/09/27/32962.html#Feedback4http://www.shnenglu.com/yuanyajie/comments/commentRss/32962.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/32962.html阅读全文

清源游民 2007-09-27 00:09 发表评论
]]>
QT的Graphics View柜架(2/3) http://www.shnenglu.com/yuanyajie/archive/2007/09/26/32961.html清源游民清源游民Wed, 26 Sep 2007 15:57:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/09/26/32961.htmlhttp://www.shnenglu.com/yuanyajie/comments/32961.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/09/26/32961.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/32961.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/32961.html阅读全文

清源游民 2007-09-26 23:57 发表评论
]]>
QT的Graphics View柜架(1/3)http://www.shnenglu.com/yuanyajie/archive/2007/09/26/32960.html清源游民清源游民Wed, 26 Sep 2007 15:49:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/09/26/32960.htmlhttp://www.shnenglu.com/yuanyajie/comments/32960.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/09/26/32960.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/32960.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/32960.html阅读全文

清源游民 2007-09-26 23:49 发表评论
]]>
QT中的对象?wi)与对象拥有?/title><link>http://www.shnenglu.com/yuanyajie/archive/2007/09/25/32854.html</link><dc:creator>清源游民</dc:creator><author>清源游民</author><pubDate>Tue, 25 Sep 2007 12:36:00 GMT</pubDate><guid>http://www.shnenglu.com/yuanyajie/archive/2007/09/25/32854.html</guid><wfw:comment>http://www.shnenglu.com/yuanyajie/comments/32854.html</wfw:comment><comments>http://www.shnenglu.com/yuanyajie/archive/2007/09/25/32854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yuanyajie/comments/commentRss/32854.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yuanyajie/services/trackbacks/32854.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/yuanyajie/archive/2007/09/25/32854.html'>阅读全文</a><img src ="http://www.shnenglu.com/yuanyajie/aggbug/32854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yuanyajie/" target="_blank">清源游民</a> 2007-09-25 20:36 <a href="http://www.shnenglu.com/yuanyajie/archive/2007/09/25/32854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的QTW记打包下蝲http://www.shnenglu.com/yuanyajie/archive/2007/09/24/32795.html清源游民清源游民Mon, 24 Sep 2007 09:59:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/09/24/32795.htmlhttp://www.shnenglu.com/yuanyajie/comments/32795.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/09/24/32795.html#Feedback10http://www.shnenglu.com/yuanyajie/comments/commentRss/32795.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/32795.html阅读全文

清源游民 2007-09-24 17:59 发表评论
]]>
Qt 中的多线E??http://www.shnenglu.com/yuanyajie/archive/2007/08/22/30610.html清源游民清源游民Wed, 22 Aug 2007 09:24:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/08/22/30610.htmlhttp://www.shnenglu.com/yuanyajie/comments/30610.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/08/22/30610.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/30610.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/30610.html阅读全文

清源游民 2007-08-22 17:24 发表评论
]]>
Qt 中的多线E?一)http://www.shnenglu.com/yuanyajie/archive/2007/08/22/30599.html清源游民清源游民Wed, 22 Aug 2007 08:48:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/08/22/30599.htmlhttp://www.shnenglu.com/yuanyajie/comments/30599.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/08/22/30599.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/30599.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/30599.html阅读全文

清源游民 2007-08-22 16:48 发表评论
]]>
试用QT中的多语a译http://www.shnenglu.com/yuanyajie/archive/2007/08/03/29258.html清源游民清源游民Fri, 03 Aug 2007 02:44:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/08/03/29258.htmlhttp://www.shnenglu.com/yuanyajie/comments/29258.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/08/03/29258.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/29258.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/29258.html阅读全文

清源游民 2007-08-03 10:44 发表评论
]]>
Qt Model/View 学习(fn)W记 (? http://www.shnenglu.com/yuanyajie/archive/2007/06/19/26641.html清源游民清源游民Tue, 19 Jun 2007 09:37:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/19/26641.htmlhttp://www.shnenglu.com/yuanyajie/comments/26641.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/19/26641.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/26641.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26641.html清源游民 gameogre@gmail.com

Delegate  c?br>
概念

与MVC模式不同Qmodel/viewl构没有用于与用户交互的完全独立的组件。一般来Ԍ view负责把数据展C?br>l用P也处理用L(fng)输入。ؓ(f)了获得更多的灉|性,交互通过delegagte执行。它既提供输入功能又负责渲染view中的每个数据V?控制delegates的标准接口在QAbstractItemDelegatecM定义。Delegates通过实现paint()?span style="COLOR: #ff00ff">sizeHint()以达到渲染内容的目的。然而,单的Zwidget的delegates,可以?span style="COLOR: #0000ff">QItemDelegate子类化,而不?span style="COLOR: #0000ff">QAbstractItemDelegate,q样可以使用它提供的上述函数的缺省实现。delegate可以使用widget来处理编辑过E,也可以直接对事gq行处理?/p>

使用现成的delegate
Qt提供的标准views都?span style="COLOR: #0000ff">QItemDelegate的实例来提供~辑功能。它以普通的风格来ؓ(f)每个标准view渲染数据V这些标准的views包括Q?span style="COLOR: #0000ff">QListView,QTableView,QTreeView。所有标准的角色都通过标准views包含的缺省delegateq行处理。一个view使用的delegate可以?span style="COLOR: #ff00ff">itemDelegate()函数取得,?span style="COLOR: #ff00ff">setItemDelegate() 函数可以安装一个定制delegate?/p>


一个简单的delegate
q个delegate使用QSpinBox来提供编辑功能。它主要想用于显C整数的models上。尽我们已l徏立了一个基于整数的table model,但我们也可以使用QStandardItemModelQ因为delegate可以控制数据的录入。我们又Z一个table view来显Cmodel的内容,用我们定制的delegate来编辑?br>
我们?span style="COLOR: #0000ff">QItemDelegate子类化,q样可以利用它缺省实现的昄功能。当然我们必需提供函数来管理用于编辑的widget:
class SpinBoxDelegate : public QItemDelegate
 {
     Q_OBJECT

 public:
     SpinBoxDelegate(QObject *parent = 0);

     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                           const QModelIndex &index) const;

     void setEditorData(QWidget *editor, const QModelIndex &index) const;
     void setModelData(QWidget *editor, QAbstractItemModel *model,
                       const QModelIndex &index) const;

     void updateEditorGeometry(QWidget *editor,
         const QStyleOptionViewItem &option, const QModelIndex &index) const;
 };
需要注意的?当一个delegate创徏Ӟ不需要安装一个widgetQ只有在真正需要时才创个用于编辑的widget?br>
提供~辑?/strong>
在这个例子中Q当table view需要提供一个编辑器Ӟ它要求delegate提供一个可用于~辑的widget,它应该适用于当前正被修改的数据V这正是createEditor()函数应该实现的:(x)
QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
     const QStyleOptionViewItem &/* option */,
     const QModelIndex &/* index */) const
 {
     QSpinBox *editor = new QSpinBox(parent);
     editor->setMinimum(0);
     editor->setMaximum(100);

     return editor;
 }
我们不需要跟t这个widget的指针,因ؓ(f)view?x)在不需要时销毁这个widget。我们也l编辑安装了delegate~省的事件过滤器Q这提供了用h望的标准~辑快捷键。view通过我们定义相应的函数来保证~辑器的数据与几何布局被正的讄。我们也可以Ҏ(gu)不同的model index来创Z同的~辑器,比如Q我们有一列整敎ͼ一列字W串Q我们可以根据哪U列被编辑来创徏一个QSpinBox或是QLineEdit。delegate必需提供一个函数把model中的数据拯到编辑器中?br>void SpinBoxDelegate::setEditorData(QWidget *editor,
                                     const QModelIndex &index) const
 {
     int value = index.model()->data(index, Qt::DisplayRole).toInt();

     QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
     spinBox->setValue(value);
 }

向model提交数据
q需要我们实现另外一个函?span style="COLOR: #ff00ff">setModelData():

void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                    const QModelIndex &index) const
 {
     QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
     spinBox->interpretText();
     int value = spinBox->value();

     model->setData(index, value);
 }

标准的QItemDelegatecd它完成编辑时?x)发closeEditor()信号来通知view。view保证~辑器widget关闭与销毁。本例中我们只提供简单的~辑功能Q因此不需要发送个信号?/p>

更新~辑器几何布局

delegate负责理~辑器的几何布局。这些几何布局信息在编辑创建时或view的尺怽|发生改变时Q?br>都应当被提供。幸q的是,view通过一个view option可以提供q些必要的信息?br> void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
     const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
 {
     editor->setGeometry(option.rect);
 }

~辑提示
~辑完成后,delegate?x)给别的lg提供有关于编辑处理结果的提示Q也提供用于后箋~辑操作的一些提C?br>q可以通过发射带有某种hint?span style="COLOR: #ff00ff">closeEditor()信号完成。这些信号会(x)被安装在spin box上的~省的QItemDelegate事gqo(h)器捕莗对q个~省的事件过滤来Ԍ当用h下回车键Qdelegate?x)对model中的数据q行提交Qƈ关闭spin box?br>我们可以安装自己的事件过滤器以迎合我们的需要,例如Q我们可以发带有EditNextItem hint?br>closeEditor()信号来实现自动开始编辑view中的下一V?/p>

 

 

 



清源游民 2007-06-19 17:37 发表评论
]]>
Qt Model/View 学习(fn)W记 (? http://www.shnenglu.com/yuanyajie/archive/2007/06/19/26622.html清源游民清源游民Tue, 19 Jun 2007 06:29:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/19/26622.htmlhttp://www.shnenglu.com/yuanyajie/comments/26622.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/19/26622.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/26622.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26622.html清源游民 gameogre@gmail.com

在views中选择数据?/em>

概念

用于新的viewcM的选择模型比Qt3中的模型有了很大的改q。它为基于model/view架构的选择提供了更为全面的描述。尽对提供了的views来说Q负责操U选择的标准类已经以应付Q但是你也可以创建特定的选择模型来满你Ҏ(gu)的需求?br>关于在view被选择的数据项的信息保持在QItemSelectionModelcȝ实例中。它也ؓ(f)每个独立的model中的数据维护model indexes信息Q与Mviews都关联关pR既然一个model可用于多个views,那么在多个views之间׃n选择信息也是可以做到的,q得多个views可以以一致的方式q行昄?br>选择由多个选择范围l成。通过仅仅记录开始model indexes与结束model indexesQ最大化地记录了可以选择的范围。非q箋选择数据由多个选择范围来描q。选择模型记录model indexes的集合来描述一个选择。最q选择的数据项被称?span style="COLOR: #0000ff">current selection。应用程序可以通过使用某种cd的选择命o(h)来修攚w择的效果?br>在进行选择操作Ӟ可以?span style="COLOR: #0000ff">QItemSelectionModel看成是model中所有数据项选择状态的一个记录。一旦徏立一个选择模型Q所有项的集合都可以选择Q撤消选择Q或者选择状态进行切换而不需要知道哪个数据项是否已经被选择q。所有被选择的项的indexes在Q何时候都可以得到Q通过信号槽机制可以通知别的lg发生的变化?br>
使用选择模型
标准viewcL供了~省的选择模型Q它们可以在大次数程序中使用。一个view中的选择模型可以通过调用view的函?span style="COLOR: #ff00ff">selectionModel()取得Q也可以通过setSelectionModel()在多个views之间׃n选择模型Q因此ȝ来说构徏一个新的模型一般情况不太必要?br>通过l?span style="COLOR: #0000ff">QItemSelection指定一个model,一对model indexesQ可以创Z个选择。indexes的用法依赖于l定的model,q两个indexes被解释成选择的区块中的左上角和右下角项。model中的的选择服从于选择模型?br>
选择?/span>
构徏一个table model Q它?2个项Q用一个table viewq行昄Q?br>     TableModel *model = new TableModel(8, 4, &app);

     QTableView *table = new QTableView(0);
     table->setModel(model);

     QItemSelectionModel *selectionModel = table->selectionModel();
     QModelIndex topLeft;
     QModelIndex bottomRight;

     topLeft = model->index(0, 0, QModelIndex());
     bottomRight = model->index(5, 2, QModelIndex());
    
      QItemSelection selection(topLeft, bottomRight);
     selectionModel->select(selection, QItemSelectionModel::Select);
l果如下Q?br>

d选择状?/span>
存储在选择模型中indexes可以用selectionIndexes()函数来读取。它q回一个未排序的model indexes列表Q我们可以遍历它Q如果我们知道他们关联于哪个model的话?br>    QModelIndexList indexes = selectionModel->selectedIndexes();
     QModelIndex index;

     foreach(index, indexes) {
         QString text = QString("(%1,%2)").arg(index.row()).arg(index.column());
         model->setData(index, text);
     }
选择模型在选择发生变化时会(x)发出信号。这用于通知别的lg包括整体与当前焦炚w所发生的变化。我们可以连接selectionChanged()信号C个槽Q检查当信号产生时哪些项被选择或被取消选择。这个槽被调用时带有两个参数Q它们都?span style="COLOR: #0000ff">QItemSelection对象Q一个包含新被选择的项Q另一个包含新q被取消选择的项。下面的代码演示了给新选择的项d数据内容Q新q被取消选择的项的内容被清空?br>void MainWindow::updateSelection(const QItemSelection &selected,
     const QItemSelection &deselected)
 {
     QModelIndex index;
     QModelIndexList items = selected.indexes();

     foreach (index, items) {
         QString text = QString("(%1,%2)").arg(index.row()).arg(index.column());
         model->setData(index, text);
     }

     items = deselected.indexes();

     foreach (index, items)
      model->setData(index, "");
 }
也可以通过响应currentChanged()信号来跟t当前焦炚w.对应的槽有两个接收参数Q一个表CZ前的焦点Q另一个表C当前的焦点?br>void MainWindow::changeCurrent(const QModelIndex &current,
     const QModelIndex &previous)
 {
     statusBar()->showMessage(
         tr("Moved from (%1,%2) to (%3,%4)")
             .arg(previous.row()).arg(previous.column())
             .arg(current.row()).arg(current.column()));
 }

更新选择
选择指o(h)是通过选择标志提供的,它被定义在QItemSelectionModel::SelectionFlag中。常用的有Select标记QToggle标记QDeselect标记,Current标记QClear标记Q其意义一目了然。沿上面例子的结果执行以下代码:(x)
     QItemSelection toggleSelection;

     topLeft = model->index(2, 1, QModelIndex());
     bottomRight = model->index(7, 3, QModelIndex());
     toggleSelection.select(topLeft, bottomRight);

     selectionModel->select(toggleSelection, QItemSelectionModel::Toggle);
l果如下:


~省情况下,选择指o(h)只针对单个项(由model indexes指定)。然而,选择指o(h)可以通过与另外标记的l合来改变整行和整列。D例来_(d)假如你只使用一个index来调用select(),但是用Select标记与Rows标记的组合,那么包括那个的整行都将被选择。看以下CZQ?br>     QItemSelection columnSelection;

     topLeft = model->index(0, 1, QModelIndex());
     bottomRight = model->index(0, 2, QModelIndex());

     columnSelection.select(topLeft, bottomRight);

     selectionModel->select(columnSelection,
     QItemSelectionModel::Select | QItemSelectionModel::Columns);

     QItemSelection rowSelection;

     topLeft = model->index(0, 0, QModelIndex());
     bottomRight = model->index(1, 0, QModelIndex());

     rowSelection.select(topLeft, bottomRight);

     selectionModel->select(rowSelection,
     QItemSelectionModel::Select | QItemSelectionModel::Rows);
l果如下


选择模型中所有项
Z选择model中的所有项Q必d得创Z个选择Q它包括当前层次上的所有项:
     QModelIndex topLeft = model->index(0, 0, parent);
     QModelIndex bottomRight = model->index(model->rowCount(parent)-1,
      model->columnCount(parent)-1, parent);

    QItemSelection selection(topLeft, bottomRight);
     selectionModel->select(selection, QItemSelectionModel::Select);
index可以q样Q?br>QModelIndex parent = QModelIndex();
对具有层ơ结构的model来说Q可以?span style="COLOR: #ff00ff">hasChildren()函数来决定给定项是否是其它项的父V?br>



清源游民 2007-06-19 14:29 发表评论
]]>
Qt Model/View 学习(fn)W记 (? http://www.shnenglu.com/yuanyajie/archive/2007/06/18/26568.html清源游民清源游民Mon, 18 Jun 2007 08:15:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/18/26568.htmlhttp://www.shnenglu.com/yuanyajie/comments/26568.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/18/26568.html#Feedback1http://www.shnenglu.com/yuanyajie/comments/commentRss/26568.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26568.html清源游民 gameogre@gmail.com

View c?br>
概念

在model/view架构中,view从model中获得数据项然后昄l用戗数据显C的方式不必与model提供的表C方式相同,可以与底层存储数据项的数据结构完全不同?br>内容与显式的分离是通过?span style="COLOR: #0000ff">QAbstractItemModel提供的标准模型接口,?span style="COLOR: #0000ff">QAsbstractItemview提供的标准视图接口共同实现的。普遍用model index来表C数据项。view负责理从model中读取的数据的外观布局?br>它们自己可以L染每个数据项Q也可以利用delegate来既处理渲染又进行编辑?br>除了昄数据Qviews也处理数据项的导航,参与有关于数据项选择的部分功能。view也实C些基本的用户接口Ҏ(gu),如上下文菜单与拖拽功能。view也ؓ(f)数据Ҏ(gu)供了~省的编E功能,也可搭配delegate实现更ؓ(f)Ҏ(gu)的定制编辑的需求?br>一个view创徏时必不需要model,但在它能昄一些真正有用的信息之前Q必L供一个model。view通过使用
selections来跟t用户选择的数据项。每个view可以l护单独使用的selectionsQ也可以在多个views之间׃n。有些views,?span style="COLOR: #0000ff">QTableView?span style="COLOR: #0000ff">QTreeView,除数据项之外也可昄标题(Headers)Q标题部分通过一个view来实玎ͼQHeaderView。标题与view一hL从相同的model中获取数据。从 model中获取数据的函数?span style="COLOR: #0000ff">QabstractItemModel::headerDate()Q一般L以表单的形式中显C标题信息。可以从QHeaderView子类化,以实现更为复杂的定制化需求?br>
使用现成的view
Qt提供了三个现成的view c,它们能够以用L(fng)(zhn)的方式昄model中的数据?span style="COLOR: #0000ff">QListView把model中的数据以一个简单的列表的Ş式显C,或是以经典的图标视图的Ş式显C?span style="COLOR: #0000ff">QTreeView把model中的数据作为具有层ơ结构的列表的Ş式显C,它允总紧凑的深度嵌套的l构q行昄?span style="COLOR: #0000ff">QTableView却是把model中的数据以表格的Ş式展玎ͼ更像是一个电(sh)子表格应用程序的外观布局?br>
以上q些标准view的行以应付大多数的应用程序,它们也提供了一些基本的~辑功能Q也可以定制Ҏ(gu)的需求?/p>

使用model
以前的例子中创徏q一个string list model,可以l它讄一些数据,再创Z个view把model中的内容展示出来Q?br>int main(int argc, char *argv[])
 {
   QApplication app(argc, argv);

 // Unindented for quoting purposes:
 QStringList numbers;
 numbers << "One" << "Two" << "Three" << "Four" << "Five";

 QAbstractItemModel *model = new StringListModel(numbers);
 //要注意的是,q里把StringListModel作ؓ(f)一个QAbstractItemModel来用。这h们就可以
 //使用model中的抽象接口Q而且如果来我们用别的model代替了当前这个model,q些代码也会(x)照样工作?br> //QListView提供的列表视图以满_前这个model的需要了?br>
 QListView *view = new QListView;
 view->setModel(model);
  view->show();
  return app.exec();
}

view?x)渲染model中的内容Q通过model的接口来讉K它的数据。当用户试图~辑数据Ҏ(gu)Qview?x)用缺省的delegate来提供一个编辑构件?br>一个model,多个views
为多个views提供相同的model是非常简单的事情Q只要ؓ(f)每个view讄相同的model?br>     QTableView *firstTableView = new QTableView;
     QTableView *secondTableView = new QTableView;

     firstTableView->setModel(model);
     secondTableView->setModel(model);
在model/view架构中信受槽机制的用意味着model中发生的改变?x)传递中联结的所有view中,q保证了
不管我们使用哪个viewQ访问的都是同样的一份数据?br>
上面的图展示了一个model上的两个不同的views,管在不同的view中显C的model中的数据是一致的Q每?br>view都维护它们自q内部选择模型Q但有时候在某些情况下,׃n一个选择模型也是合理的?/p>

处理数据的选择
view中数据项选择机制?span style="COLOR: #0000ff">QItemSelectionModelcL供。所有标准的view~省都构建它们自q选择模型Q?br>以标准的方式与它们交互。选择模型可以?strong style="COLOR: #800080">selectionModel
()函数取得Q替代的选择模型也可以通过
setSelectionModel()来设|。当我们惛_一个model上提供多个一致的viewsӞq种寚w择模型的控制能力非常有用。通常来讲Q除非你子类化一个model或view,你不必直接操Uselections的内宏V?br>
多个views之间׃n选择
接着上边的例子,我们可以q样Q?br>secondTableView->setSelectionModel(firstTableView->selectionModel());
现在所有views都在同样的选择模型上操作,数据与选择w保持同步?br>
上面的例子中Q两个view的类型是相同的,假如q两个viewcd不同Q那么所选择的数据项在每个view
中的表现形式?x)有很大的不同。例如,在一个table view中一个连l的选择Q在一个tree view中表现出
来的可能?x)是几个高亮的数据项片断的组合?/p>

清源游民 2007-06-18 16:15 发表评论
]]>Qt Model/View 学习(fn)W记 (? http://www.shnenglu.com/yuanyajie/archive/2007/06/18/26555.html清源游民清源游民Mon, 18 Jun 2007 03:56:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/18/26555.htmlhttp://www.shnenglu.com/yuanyajie/comments/26555.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/18/26555.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/26555.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26555.html清源游民 gameogre@gmail.com

创徏新的Models

介绍
model/viewlg之间功能的分,允许创徏model利用现成的views。这也可以用标准的功能 囑Ş用户接口lg像QListView,QTableView和QTreeView来显C来自各U数据源的数据ؓ(f)?br>QAbstractListModelcL供了非常灉|的接口,允许数据源以层次l构的Ş式来理信息Q也允许以某U?br>方式Ҏ(gu)据进行插入、删除、修改和存储。它也提供了Ҏ(gu)拽操作的支持?br>QAbstractListModel?span style="COLOR: #0000ff">QAbstractTableModel为简单的非层ơ结构的数据提供了接口,对于比较单的list和table models来说Q这是不错的一个开始点?br>
设计一个Model
当我们ؓ(f)存在的数据结构新Z个modelӞ首先要考虑的问题是应该选用哪种model来ؓ(f)q些数据提供接口?br>假如数据l构可以用数据项的列表或表来表示Q那么可以考虑子类?span style="COLOR: #0000ff">QAbstractListModel?span style="COLOR: #0000ff">QAbstractTableModel
,既然q些cdl合理地对许多功能提供缺省实现?br>然而,假如底层的数据结构只能表C成h层次l构的树(wi)型结构,那么必须得子cdQAbstractItemModel?br>无论底层的数据结构采取何UŞ式,在特定的model中实现标准的QAbstractItemModel APIL一个不错的LQ这使得可以使用更自然的方式对底层的数据l构q行讉K。这也得用数据构徏model 更ؓ(f)Ҏ(gu)Q其?br>的model/viewlg也可以用标准的API与之q行交互?br>
一个只读modelCZ
q个CZ实现了一个简单的Q非层次l构的,只读的数据model,它基?span style="COLOR: #0000ff">QStringistModelcR它有一?span style="COLOR: #0000ff">QStringList作ؓ(f)它内部的数据源,只实C一些必要的接口。ؓ(f)了简单化Q它子类化了QAbstractListModel,q个基类提供了合理的~省行ؓ(f)Q对外提供了?span style="COLOR: #0000ff">QAbstractItemModel更ؓ(f)单的接口。当我们实现一个modelӞ不要忘了QAbstractItemModel本n不存储Q何数据,它仅仅提供了lviews讉K
数据的接口?br>class StringListModel : public QAbstractListModel
 {
     Q_OBJECT

 public:
     StringListModel(const QStringList &strings, QObject *parent = 0)
         : QAbstractListModel(parent), stringList(strings) {}

     int rowCount(const QModelIndex &parent = QModelIndex()) const;
     QVariant data(const QModelIndex &index, int role) const;
     QVariant headerData(int section, Qt::Orientation orientation,
                         int role = Qt::DisplayRole) const;

 private:
     QStringList stringList;
 };
除了构造函敎ͼ我们仅需要实C个函敎ͼ(x)rowCount()q回model中的行数Q?span style="COLOR: #ff00ff">data()q回与特定model index对应的数据项。具有良好行为的model也会(x)实现headerData()Q它q回tree和table views需要的Q在标题中显C的数据?br>因ؓ(f)q是一个非层次l构的model,我们不必考虑父子关系。假如modelh层次l构Q我们也应该实现index()?span style="COLOR: #ff00ff">parent()函数?br>
Model的尺?/strong>
我们认ؓ(f)model中的行数与string list中的string数目一_(d)(x)
int StringListModel::rowCount(const QModelIndex &parent) const
 {
     return stringList.count();
 }
在缺省情况下Q从QAbstractListModelz的model只具有一列,因此不需要实现columnCount()?br>
Model 标题与数?/strong>
 QVariant StringListModel::data(const QModelIndex &index, int role) const
 {
     if (!index.isValid())
         return QVariant();

     if (index.row() >= stringList.size())
         return QVariant();

     if (role == Qt::DisplayRole)
         return stringList.at(index.row());
     else
         return QVariant();
 }
QVariant StringListModel::headerData(int section, Qt::Orientation orientation,
                                      int role) const
 {
     if (role != Qt::DisplayRole)
         return QVariant();

     if (orientation == Qt::Horizontal)
         return QString("Column %1").arg(section);
     else
         return QString("Row %1").arg(section);
 }
一个数据项可能有多个角ԌҎ(gu)角色的不同输Z同的数据。上例中Qmodel中的数据只有一个角?Q?br>DisplayRole,然而我们也可以重用提供lDisplayRole的数据,作ؓ(f)别的角色使用Q如我们可以作ؓ(f)ToolTipRole来用?br>
可编辑的model
上面我们演示了一个只ȝmodel,它只用于向用hC,对于许多E序来说Q可~辑的list model可能更有用。我们只需要给只读的model提供另外两个函数flags()与setData()的实现。下列函数声明被d到类定义中:(x)
     Qt::ItemFlags flags(const QModelIndex &index) const;
     bool setData(const QModelIndex &index, const QVariant &value,
                  int role = Qt::EditRole);

让model可编?br>delegate?x)在创徏~辑器之前检查数据项是否是可~辑的。model必须得让delegate知道它的数据Ҏ(gu)?br>~辑的。这可以通过为每一个数据项q回一个正的标记得到Q在本例中,我们假设所有的数据w?br>可编辑可选择的:(x)
Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const
 {
     if (!index.isValid())
         return Qt::ItemIsEnabled;

     return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
 }
我们不必知道delegate执行怎样实际的编辑处理过E,我们只需提供ldelegate一个方法,delegate?x)用它对model中的数据q行讄。这个特D的函数是setData():
bool StringListModel::setData(const QModelIndex &index,
                               const QVariant &value, int role)
 {
     if (index.isValid() && role == Qt::EditRole) {

         stringList.replace(index.row(), value.toString());
         emit dataChanged(index, index);
         return true;
     }
     return false;
 }
当数据被讄后,model必须得让views知道一些数据发生了变化Q这可通过发射一个dataChanged() 信号实现?br>因ؓ(f)只有一个数据项发生了变化,因此在信号中说明的变化范围只限于一个model index?br>插入Q删除行
在model中改变行C列数是可能的。当然在本列中,只考虑行的情况Q我们只需要重新实现插入、删?br>的函数就可以了,下面应在cd义中声明Q?br>     bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex());
     bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());
既然model中的每行对应于列表中的一个string,因此QinsertRows()函数在string list  中指定位|插入一个空string,
父index通常用于军_model中行列的位置Q本例中只有一个单独的,困此只需要在list中插入空string?br>bool StringListModel::insertRows(int position, int rows, const QModelIndex &parent)
 {
     beginInsertRows(QModelIndex(), position, position+rows-1);

     for (int row = 0; row < rows; ++row) {
         stringList.insert(position, "");
     }

     endInsertRows();
     return true;
 }
beginInsertRows()通知其他lg行数会(x)改变。endInsertRows()Ҏ(gu)作进行确认与通知?br>q回true表示成功?br>删除操作与插入操作类|(x)
bool StringListModel::removeRows(int position, int rows, const QModelIndex &parent)
 {
     beginRemoveRows(QModelIndex(), position, position+rows-1);

     for (int row = 0; row < rows; ++row) {
         stringList.removeAt(position);
     }

     endRemoveRows();
     return true;
 }



清源游民 2007-06-18 11:56 发表评论
]]>
Qt Model/View 学习(fn)W记 (? http://www.shnenglu.com/yuanyajie/archive/2007/06/17/26488.html清源游民清源游民Sun, 17 Jun 2007 06:31:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/17/26488.htmlhttp://www.shnenglu.com/yuanyajie/comments/26488.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/17/26488.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/26488.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26488.html清源游民 gameogre@gmail.com

Modelc?br>
基本概念
在model/view构架中,model为view和delegates使用数据提供了标准接口。在Qt中,标准接口QAbstractItemModelcM被定义。不数据在底层以何U数据结构存储,QAabstractItemModel的子cM(x)以层ơ结构的形式来表C数据,l构中包含了数据表。我们按q种U定来访问model中的数据,但这个约定不?x)对如何昄q些数据有Q何限制。数据发生改变时Qmodel通过信号槽机制来通知兌的views?br>

Model Indexes

Z使数据存储与数据讉K分开Q引入了model index的概c通过model indexQ可以引用model中的数据,Views和delegates都用indexes来访问数据项Q然后再昄出来。因此,只有model需要了解如何获取数据,被model理的数据类型可以非常广泛地被定义。Model indexes包含一个指向创建它们的model的指针,q会(x)在配合多个model工作旉免؜乱?br>QAbstractItemModel *model = index.model();

model indexes提供了对一Ҏ(gu)据信息的临时引用Q通过它可以访问或是修改model中的数据。既然model有时?x)重新组l内部的数据l构Q这时model indexes便会(x)失效Q因此不应该保存临时的model indexes。假如需要一个对数据信息的长期的引用Q那么应该创Z?span style="COLOR: #0000ff">persistent model index。这个引用会(x)保持更新。(f)时的model indexes?span style="COLOR: #0000ff">QModelIndex提供Q而具有持久能力的model indexes则由QPersistentModelIndex提供。在获取对应一个数据项的model indexӞ需要考虑有关于model的三个属性:(x)行数Q列敎ͼ爉的model index?/p>


行与?/strong>
在最基本的Ş式中Q一个model可作Z个简单的表来讉KQ每个数据项pQ列数来定位。这必不意味着
底层的数据用数组l构来存储。行和列的用仅仅是一U约定,它允许组件之间相互通讯。可以通过指定
model中的行列数来获取MҎ(gu)据,可以得到与数据项一一对应的那个index?br>QModelIndex index = model->index(row, column, ...);
Model为简单的Q单U的数据l构如list与tables提供了接口,它们如上面代码所昄的那P不再需要别的信息被提供。当我们在获取一个model indexӞ我们需要提供另外的信息?br>

上图代表一个基本的table modelQ它的每一用一对行列数来定位。通过行列敎ͼ可以获取代表一个数据项的model index .
QModelIndex indexA = model->index(0, 0, QModelIndex());
 QModelIndex indexB = model->index(1, 1, QModelIndex());
 QModelIndex indexC = model->index(2, 1, QModelIndex());
一个model的顶U项,由QModelIndex()取得Q它们上式被用作爉?/p>


cM于表的接口在搭配使用table或list view时理想的Q这U行列系l与view昄的方式是切匚w的?br>然则Q像tree viewsq种l构需要model提供更ؓ(f)灉|的接口来讉K数据V每个数据项可能是别的项?br>爉Q上U的可以获取下U项的列表?br>当获取model中数据项的indexӞ我们必须指定关于数据的爉的信息。在model外部Q引用一个数?br>的唯一Ҏ(gu)是通过model index,因此需要在求取model index时指定父的信息?br>QModelIndex index = model->index(row, column, parent);

上图中,A和C作为model中顶层的兄弟:(x)
 QModelIndex indexA = model->index(0, 0, QModelIndex());
 QModelIndex indexC = model->index(2, 1, QModelIndex());
A有许多孩子,它的一个孩子B用以下代码获取:(x)
QModelIndex indexB = model->index(1, 0, indexA);

角?/span>
model中的可以作为各U角色来使用Q这允许Z同的环境提供不同的数据。D例来_(d)Qt::DisplayRole被用于访问一个字W串Q它作ؓ(f)文本?x)在view中显C。典型地Q每个数据项都可以ؓ(f)许多不同的角色提供数据,标准的角色在Qt::ItemDataRole中定义。我们可以通过指定model index与角色来获取我们需要的数据Q?br>QVariant value = model->data(index, role);

角色指出了从model中引用哪U类型的数据。views可以用不同的形式昄角色Q因此ؓ(f)每个角色提供正确
的信息是非常重要的。通过为每个角色提供适当数据Qmodel也ؓ(f)views和delegates提供了暗C,如何正确?br>把这些数据项昄用户。不同的views可以自由地解析或忽略q些数据信息Q对于特D的场合Q也可以定义
一些附加的角色?br>概念ȝQ?/strong>
1QModel indexes为views与delegages提供model中数据项定位的信息,它与底层的数据结构无兟?br>2Q通过指定行,列数Q父的model index来引用数据项?br>3,依照别的lg的要求,model indexes被model构徏?br>4Q用index()Ӟ如果指定了有效的爉的model index,那么q回得到的model index对应于父的某个孩子?br>5Q用index()Ӟ如果指定了无效的爉的model index,那么q回得到的model index对应于顶层项的某个孩子?br>6, 角色对一个数据项包含的不同类型的数据l出了区分?/p>

使用Model Indexes
QDirModel *model = new QDirModel;
     QModelIndex parentIndex = model->index(QDir::currentPath());
     int numRows = model->rowCount(parentIndex);
 for (int row = 0; row < numRows; ++row)
 {
         QModelIndex index = model->index(row, 0, parentIndex);
         tring text = model->data(index, Qt::DisplayRole).toString();
         // Display the text in a widget.

     }
以上的例子说明了从model中获取数据的基本原则Q?br>1Qmodel的尺寸可以从rowCount()?span style="COLOR: #ff00ff">columnCount()中得出。这些函数通常都需要一个表C父的model index?br>2Qmodel indexes用来从model中访问数据项Q数据项用行Q列Q父model index定位?br>3, Z讉Kmodel层,可以使用QModelIndex()指定?br>4, 数据ؓ(f)不同的角色提供不同的数据。ؓ(f)了获取数据,除了model index之外Q还要指定角艌Ӏ?br>



清源游民 2007-06-17 14:31 发表评论
]]>
Qt Model/View 学习(fn)W记 (? http://www.shnenglu.com/yuanyajie/archive/2007/06/15/26390.html清源游民清源游民Fri, 15 Jun 2007 09:04:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/15/26390.htmlhttp://www.shnenglu.com/yuanyajie/comments/26390.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/15/26390.html#Feedback1http://www.shnenglu.com/yuanyajie/comments/commentRss/26390.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26390.html阅读全文

清源游民 2007-06-15 17:04 发表评论
]]>
Qt Model/View 学习(fn)W记 (一)http://www.shnenglu.com/yuanyajie/archive/2007/06/15/26387.html清源游民清源游民Fri, 15 Jun 2007 07:53:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/15/26387.htmlhttp://www.shnenglu.com/yuanyajie/comments/26387.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/15/26387.html#Feedback0http://www.shnenglu.com/yuanyajie/comments/commentRss/26387.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26387.html 清源游民   gameogre@gmail.com

介绍

Qt 4推出了一l新的item viewc,它们使用model/viewl构来管理数据与表示层的关系。这U结构带来的
功能上的分离l了开发h员更大的Ҏ(gu)来定制数据的表示Q它也提供一个标准的model接口Q得更多的
数据源可以被q些item view使用。这里对model/view的结构进行了描述Q结构中的每个组仉q行了解释,
l出了一些例子说明了提供的这些类如何使用?/p>

Model/View  l构

Model-View-Controller(MVC)Q?是从Smalltalk发展而来的一U设计模式,常被用于构徏用户界面。经典设计模式的著作中有q样的描qͼ(x)

MVC ׃U对象组成。Model是应用程序对象,View是它的屏q表C,Controller定义了用L(fng)面如何对用户输入q行响应。在MVC之前Q用L(fng)面设计們֐于三者揉合在一PMVC对它们进行了解耦,提高了灵zL与重用性?/em>

假如把view与controllerl合在一Pl果是model/viewl构。这个结构依然是把数据存储与数据表示q行了分,它与MVC都基于同L(fng)思想Q但它更单一些。这U分M得在几个不同的view上显C同一个数据成为可能,也可以重新实现新的view,而不必改变底层的数据l构。ؓ(f)了更灉|的对用户输入q行处理Q引入了delegateq个概念。它的好处是Q数据项的渲染与~程可以q行定制?br>
如上图所C,model与数据源通讯Qƈ提供接口l结构中的别的组件用。通讯的性质依赖于数据源的种c?br>与model实现的方式。view从model获取model indexes,后者是数据的引用。通过把model indexes提供lmodel,view可以从数据源中获取数据?/p>

在标准的views中,delegate?x)对数据进行渲染,当某个数据项被选中Ӟdelegate通过model indexes与model直接q行交流。ȝ来说Qmodel/view 相关cd以被分成上面所提到的三l:(x)models,views,delegates。这些组仉过抽象cL定义Q它们提供了共同的接口,在某些情况下Q还提供了缺省的实现。抽象类意味着需要子cd以提供完整的其他lg希望的功能。这也允许实现定制的lg。models,views,delegates之间通过信号Q槽机制来进行通讯Q?/p>

从model发出的信号通知view数据源中的数据发生了改变?br>从view发出的信h供了有关被显C的数据与用户交互的信息?br>从delegate发生的信可用于在编辑时通知model和view关于当前~辑器的状态信息?/p>

Models

所有的item models都基?span style="COLOR: #0000ff">QAbstractItemModelc,q个cd义了用于views和delegates讉K数据的接口?br>数据本n不必存储在model,数据可被|于一个数据结构或另外的类Q文Ӟ数据库,或别的程序组件中?br>关于model的基本概念在Model Classes部分中描q?br>QAbstractItemModel提供l数据一个接口,它非常灵z,基本满views的需要,无论数据用以下Q何样的Ş?br>表现Q如tables,lists,trees。然而,当你重新实现一个modelӞ如果它基于table或list形式的数据结构,最好从QAbstractListModel,QAbstractTableModel开始做P因ؓ(f)它们提供了适当的常规功能的~省实现。这些类可以被子cd以支持特D的定制需求。子cdmodel的过E在Create New Model部分讨论
QT提供了一些现成的models用于处理数据:(x)
QStringListModel 用于存储单的QString列表?br>QStandardItemModel 理复杂的树(wi)型结构数据项Q每w可以包含L数据?br>QDirModel  提供本地文gpȝ中的文g与目录信息?br>QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用来讉K数据库?br>假如q些标准Model不满你的需要,你应该子cdQAbstractItemModel,QAbstractListModel或是
QAbstractTableModel来定制?/p>

Views

不同的view都完整实C各自的功能:(x)QListView把数据显CZؓ(f)一个列表,QTableView把Model 中的数据以table的Ş式表玎ͼQTreeView 用具有层ơ结构的列表来显Cmodel中的数据。这些类都基?span style="COLOR: #0000ff">QAbstractItemView抽象基类Q尽这些类都是现成的,完整的进行了实现Q但它们都可以用于子cd以便满定制需求?/p>

Delegates
QAbstractItemDelegate 是model/view架构中的用于delegate的抽象基cR缺省的delegate实现?span style="COLOR: #0000ff">QItemDelegatecM提供。它可以用于Qt标准views的缺?delegate.

排序

在model/view架构中,有两U方法进行排序,选择哪种Ҏ(gu)依赖于你的底层Model?br>假如你的model是可排序的,也就是它重新实现?span style="COLOR: #0000ff">QAbstractItemModel::sort()函数Q?span style="COLOR: #0000ff">QTableView?span style="COLOR: #0000ff">QTreeView都提供了API,允许你以~程的方式对Model数据q行排序。另外,你也可以q行交互方式下的排序Q例如,允许用户通过点击view表头的方式对数据q行排序Q,可以q样做:(x)?span style="COLOR: #0000ff">QHeaderView::sectionClicked()信号与QTableView::sortByColum()槽或QTreeView::sortByColumn()槽进行联l就好了?br>另一U方法是Q假如你的model没有提供需要的接口或是你想用list view表示数据Q可以用一个代?br>model在用view表示数据之前对你的model数据l构q行转换?/p>

便利c?/span>

许多便利c都源于标准的viewc,它们方便了那些用Qt中基于项的view与tablec,它们不应该被子类化,
它们只是为Qt 3的等L(fng)提供一个熟(zhn)的接口。这些类?span style="COLOR: #0000ff">QListWidget,QTreeWidget,QTableWidget,它们提供了如Qt 3中的QListBox, QlistView,QTable怼的行为。这些类比Viewcȝ灵zL,不能用于L的models,推介使用model/view的方法处理数据?/p>

 

 



清源游民 2007-06-15 15:53 发表评论
]]>
QT中的事g机制http://www.shnenglu.com/yuanyajie/archive/2007/06/13/26283.html清源游民清源游民Wed, 13 Jun 2007 14:42:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/06/13/26283.htmlhttp://www.shnenglu.com/yuanyajie/comments/26283.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/06/13/26283.html#Feedback2http://www.shnenglu.com/yuanyajie/comments/commentRss/26283.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/26283.html原文Another Look at Events 
作者:(x) Jasmin Blanchette  译:(x)清源游民 gameogre@gmail.com

什么是自发事gQ哪些类型的事g可以被propagated 或compressed? posting and sending 事g之间有何不同Q什么时候应该调?accept() 或是ignore() ? 如果q些问题你还不是很了解,那么l箋看下厅R?/p>

事ghQ?/span>

Z事g如何被生与分发Q可以把事g分ؓ(f)三类Q?br>* Spontaneous 事g,q口系l生,它们被放到系l队列中Q通过事g循环逐个处理?br>* Posted 事gQ由Qt或是应用E序产生Q它们被Qtl成队列Q再通过事g循环处理?br>* Sent  事gQ由Qt或是应用E序产生Q但它们被直接发送到目标对象?br>当我们在main()函数的末调?span style="COLOR: #0000ff">QApplication::exec()?E序q入了Qt的事件@环,大概来讲Q事件@环如下面所C:(x)
while (!exit_was_called)
{
  while(!posted_event_queue_is_empty)
       {
         process_next_posted_event();
       }
  while(!spontaneous_event_queue_is_empty)
      {
         process_next_spontaneous_event();
      }
  while(!posted_event_queue_is_empty)
      {
        process_next_posted_event();
      }
}
首先Q事件@环处理所有的posted事gQ直到队列空。然后再处理所有的spontaneous事gQ最后它处理所有的因ؓ(f)处理spontaneous事g而生的posted事g。send 事gq不在事件@环内处理Q它们都直接被发送到了目标对象。现在看一下实践中的paint 事g是如何工作的。当一个widgetW一ơ可见,或是被遮挡后再次变ؓ(f)可见Q?br>H口pȝ产生一?spontaneous) paint事gQ要求程序重画widget,事g循环最l从事g队列中捡选这个事件ƈ把它分发到那个需要重ȝwidget?br>q不是所有的paint事g都是q口系l生的。当你调?span style="COLOR: #0000ff">QWidget::update()d行重画widget,q个widget?x)post 一个paint 事gl自己。这个paint事g被放入队列,最l被事g循环分发之?br>假如你很不耐烦Q等不及(qing)事g循环去重M个widget, 理论上,你应该直接调用paintEvent()强制q行立即的重甅R但实际上这不L可行的,因ؓ(f)paintEvent()函数是protected的(很可能访问不了)。它也绕开了Q何存在的事gqo(h)器。因些原因,Qt提供了一个机Ӟ直接sending事g而不是posting ?br>QWidget::repaint()׃用了q个机制来强制进行立即重甅R?br>posting 相对于sending的一个优势是Q它l了Qt一个压~?compress)事g的机?x)。假如你在一个widget上连l地调用update() 十次Q因update()而生的q十个事Ӟ会(x)自动地被合ƈZ个单独的事gQ但?span style="COLOR: #0000ff">QPaintEvents事g附带的区域信息也合ƈ了。可压羃的事件类型包括:(x)paint,move,resize,layout hint,language change?br>最后要注意Q你可以在Q何时候调?span style="COLOR: #0000ff">QApplication::sendPostedEvent()Q强制Qt产生一个对象的posted事g?/p>

人工合成的事?br>
QT应用E序可以产生他们自己的事Ӟ或是预定义类型,或是自定义类型?q可以通过创徏QEventcL它的
子类的实例,q且调用QApplication:postEvent()?span style="COLOR: #0000ff">QApplication::sendEvent()来实现?br>q两个函数需要一?QObject* 与一个QEvent * 作ؓ(f)参数Q假如你调用postEvent(),你必ȝ new 操作W来创徏事g对象QQt?x)它被处理后帮你删除它。假如你用sendEvent(), 你应该在栈上来创Z件。下面D两个例子Q?br>一是posting 事gQ?br>QApplication::postEvent(mainWin, new QKeyEvent(QEvent::KeyPress,Key_X,'X',0));
二是sending 事gQ?br>    QKeyEvent event(QEvent::KeyPress, Key_X, 'X', 0);
    QApplication::sendEvent(mainWin, &event);
Qt应用E序很少直接调用postEvent()或是sendEvnet()Q因为大多数事g?x)在必要时被Qt或是H口pȝ自动产生
。在大多数的情况下,当你惛_送一个事件时QQt已经Z准备好了一个更高的函数来Z服务。(例如
update()与repaint())?/p>

定制事gcd

qt允许你创q事gcdQ这在多U程的程序中其有用。在单线E的E序也相当有用,它可以作?br>对象间的一U通讯机制。ؓ(f)什么你应该用事件而不是其他的标准函数调用Q或信号、槽的主要原因是Q事件既可用于同步也可用于异步(依赖于你是调用sendEvent()或是postEvents()),函数调用或是槽调用L同步的。事件的另外一个好处是它可以被qo(h)?br>演示如何post一个定制事件的代码片段Q?br>const QEvent::Type MyEvent = (QEvent::Type)1234;
  ...
QApplication::postEvent(obj, new QCustomEvent(MyEvent));
事g必须是QCustomEventcd(或子c)的。构造函数的参数是事件的cdQ?024以下被Qt保留。其他可被程序用。ؓ(f)处理定制事gcdQ要重新实现customEvent()函数Q?br>void MyLineEdit::customEvent(QCustomEvent *event)
    {
        if (event->type() == MyEvent) {
            myEvent();
        } else {
            QLineEdit::customEvent(event);
        }
    }
QcustomEventcL一个void *的成员,可用于特定的目的。你也可以子cdQCustomEventQ加上别的成员,但是你也需要在customEvent()中{?span style="COLOR: #0000ff">QCustomeEventCҎ(gu)的类型?/p>

事g处理与过?br>
Qt中的事g可以在五个不同的层次上被处理
1,重新实现一个特定的事ghandler
 QObject?span style="COLOR: #0000ff">QWidget提供了许多特定的事ghandlersQ分别对应于不同的事件类型。(如paintEvent()对应paint事gQ?br>2,重新实现QObject::event()
 event()函数是所有对象事件的入口QQObject和QWidget中缺省的实现是简单地把事件推入特定的事ghandlers?br>3,?span style="COLOR: #0000ff">QObject安装上事件过滤器
  事gqo(h)器是一个对象,它接收别的对象的事gQ在q些事g到达指定目标之间?br>4Q在aApp上安装一个事件过滤器Q它?x)监视程序中发送到所有对象的所有事?br>5,重新实现QApplication:notify(),Qt的事件@环与sendEvent()调用q个函数来分发事Ӟ通过重写它,你可以在别h之前看到事g?/p>

一些事件类型可以被传递。这意味着假如目标对象不处理一个事ӞQt?x)试着L另外的事件接收者。用新的目标来调?span style="COLOR: #0000ff">QApplication::notify()。D例来Ԍkey事g是传递的Q假如拥有焦点的Widget不处理特定键QQt?x)分发相同的事gl父widget,然后是父亲的父亲Q直到最层widget?/p>

接受或是忽略Q?br>
可被传递的事g有一个accept()函数和一个ignore()函数Q你可以用它们来告诉QtQ你“接收”或是
“忽略”q个事g。假如事件handler调用accept(),q个事g不?x)再被传递。假如事件handler调用
ignore(),Qt?x)试着查找另外的事件接收者?br>像大多数的开发者一P你可能不?x)被调用accept()或是ignore()所烦恼。缺省情况下?#8220;接收”Q在
QWidget中的~省实现是调用ignore(),假如你希望接收事Ӟ你需要做的是重新实现事ghandlerQ避?br>调用QWidget的实现。假如你?#8220;忽略”事gQ只需单地传递它到QWidget的实现。下面的代码演示了这一点:(x)
void MyFancyWidget::keyPressEvent(QKeyEvent *event)
    {
        if (event->key() == Key_Escape) {
            doEscape();
        } else {
            QWidget::keyPressEvent(event);
        }
    }
在上面的例子里,假如用户按了"ESC"键,我们?x)调用doEscape()q且事g?#8220;接收”了(q是~省的情况)Q?br>事g不会(x)被传递到父widget,假如用户按了别的键,则调用QWidget的缺省实现?br>void QWidget::keyPressEvent(QKeyEvent *event)
    {
        event->ignore();
    }
应该感谢ignore()Q事件会(x)被传递到父widget中去?br>讨论到目前ؓ(f)臻I我们都假讑֟cLQWidget,然而,同样的规则也可以应用到别的层ơ中Q只要用QWidget
代替基类卛_。D例来_(d)(x)
 void MyFancyLineEdit::keyPressEvent(QKeyEvent *event)
    {
        if (event->key() == Key_SysReq) {
            doSystemRequest();
        } else {
            QLineEdit::keyPressEvent(event);
        }
    }
׃某些原因Q你?x)在event()中处理事Ӟ而不是在特定的handler中,如keyPressEvent(),q个q程?x)有些不同。event()?x)返回一个布?yu)(dng)|来告诉调用者是否事件被accept或ignore,(true表示accept),从event()中调用accept()或是ignore()是没有意义的?#8220;Accept”标记是event()与特定事件handler之间的一U通讯机制。而从event()q回的布?yu)(dng)值却是用来与QApplication:notify()通讯的。在QWidgetk中缺省的event()实现是{?#8220;Accept”标记Z个布?yu)(dng)|如下所C:(x)
bool QWidget::event(QEvent *event)
    {
        switch (e->type()) {
        case QEvent::KeyPress:
            keyPressEvent((QKeyEvent *)event);
            if (!((QKeyEvent *)event)->isAccepted())
                return false;
            break;
        case QEvent::KeyRelease:
            keyReleaseEvent((QKeyEvent *)event);
            if (!((QKeyEvent *)event)->isAccepted())
                return false;
            break;
            ...
        }
        return true;
    }

到现在ؓ(f)臻I我们所说的内容不仅仅适用于key事gQ也适用于mouse,wheel,tablet,context menu{事?br>Close事g有点不同Q调?span style="COLOR: #0000ff">QCloseEvent:ignore()取消了关闭操作,而accept()告诉Qtl箋执行正常的关闭操作。ؓ(f)了避免؜乱,最好是在closeEvent()的新实现中明地q行accept()与ignore()的调用:(x)
 void MainWindow::closeEvent(QCloseEvent *event)
    {
        if (userReallyWantsToQuit()) {
            event->accept();
        } else {
            event->ignore();
        }
    }


 



清源游民 2007-06-13 22:42 发表评论
]]>
Ogre3D嵌入Qt框架 之 结http://www.shnenglu.com/yuanyajie/archive/2007/05/21/24528.html清源游民清源游民Mon, 21 May 2007 03:57:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/05/21/24528.htmlhttp://www.shnenglu.com/yuanyajie/comments/24528.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/05/21/24528.html#Feedback10http://www.shnenglu.com/yuanyajie/comments/commentRss/24528.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/24528.html阅读全文

清源游民 2007-05-21 11:57 发表评论
]]>
Ogre3D嵌入Qt框架 之 U?/title><link>http://www.shnenglu.com/yuanyajie/archive/2007/05/21/24506.html</link><dc:creator>清源游民</dc:creator><author>清源游民</author><pubDate>Sun, 20 May 2007 17:26:00 GMT</pubDate><guid>http://www.shnenglu.com/yuanyajie/archive/2007/05/21/24506.html</guid><wfw:comment>http://www.shnenglu.com/yuanyajie/comments/24506.html</wfw:comment><comments>http://www.shnenglu.com/yuanyajie/archive/2007/05/21/24506.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/yuanyajie/comments/commentRss/24506.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yuanyajie/services/trackbacks/24506.html</trackback:ping><description><![CDATA[<p>环境QWindowsXp Pro SP2, VS2003.NET, Ogre1.4.1(Eihort), Qt 4.2.2 开源版<br>参考:(x)ShowMesh,MAGE,两款工具源码<br>先把囄出来Q有旉文字ȝ一下,隑ֺ虽然不高Q但也折腾不时?也算q来学习(fn)Qt与Ogre的一个小l?br><br><img height=480 alt="" src="http://www.shnenglu.com/images/cppblog_com/yuanyajie/2865/r_ShowOgreEmbedInQt.jpg" width=612 border=0><br></p> <img src ="http://www.shnenglu.com/yuanyajie/aggbug/24506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yuanyajie/" target="_blank">清源游民</a> 2007-05-21 01:26 <a href="http://www.shnenglu.com/yuanyajie/archive/2007/05/21/24506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2003下安装QT4.2.2开源版http://www.shnenglu.com/yuanyajie/archive/2007/03/27/20716.html清源游民清源游民Tue, 27 Mar 2007 08:47:00 GMThttp://www.shnenglu.com/yuanyajie/archive/2007/03/27/20716.htmlhttp://www.shnenglu.com/yuanyajie/comments/20716.htmlhttp://www.shnenglu.com/yuanyajie/archive/2007/03/27/20716.html#Feedback2http://www.shnenglu.com/yuanyajie/comments/commentRss/20716.htmlhttp://www.shnenglu.com/yuanyajie/services/trackbacks/20716.htmldownload
2, 取得Win32下的补丁download
3, 两个文件解压到相同目录Q如D:\Qt4
4, 打开VS2003命o(h)行窗?q自动对环境变量q行了设|?br>5,从命令行H口q入D:Qt4, 执行installpatch42.bat Q这是从补丁解压得到的文件之一?br>6, 执行 qconfigure.bat  msvc.net
7,提示协议信息Q?{待响应Q键?Y'
8,又提C,键入'y'
9可能又一个提C?键入'y'
10,出现cM以下提示:
====================================================
You are now ready to build Qt
If you specified -static, type 'nmake sub-src'
otherwise, type 'nmake'
To start over, type 'nmake distclean'
and then re-run qconfigure.bat
====================================================
11, 执行 nmake
12,~译l束后,讄机器的环境变?path Q?d路径 D:\Qt4\bin , 创徏新的变量Q?/font>QMAKESPECQ?font color=#000000>gؓ(f)win32-msvc.net
13,新徏一个文件hello.cpp,内容如下(开始测试是否安装好?
#include <QApplication>
#include <QLabel>
int main(int argc, char **argv) {
  QApplication app(argc, argv);
  QLabel *label = new QLabel("Hello World!");
 
  label->show();
  return app.exec();
}
14Q在VS2003命o(h)H口下,q入cpp文g所在目录,如D:\test
15,qmake -project -t vcapp -o projectname.pro
16,再来一ơ,不带参数 qmake
17,当前目录下生成了VS工程文gQ?tt>projectname.vcproj
18,用VS2003?此工E打开Q编译,q行?br>


清源游民 2007-03-27 16:47 发表评论
]]>
þþƷ99þ޶| þþþ޾Ʒַ| 㽶aaþëƬ| 99þþƷۺһ | 99þ99þþƷƬ| ŷvaþþþ| ٸ߳ҽоþþþþ| ۺϾþþƷɫ| þֻǾƷ23| þþþþþ91Ʒѹۿ| þ۲ӰԺѿҹɫ| ĻƷþþþþ3Dն| þþþƷƵѹۿ| ޾Ʒþþþþ| þۺϾƷþ| ɫۺϾþþþþþþ| Ʒþþþ9999| þ¾Ʒ| ŷСþþþþþ| ŷ޹Ʒþþþ| AëƬþþƷ| þüۺɫۺϰҲȥ| ڵþ| þùҹaӰԺ| þþþþùƷŮ| ˮϵþþƷ| 91þþþþþ| ݺɫþþۺ| þþƷƷ޾Ʒ| ŷ龫Ʒþþþþþ| Ʒþþþþ| þŮƵ| þ99Ʒþ99С˵| Ʒþþþþø | ݺɫۺϾþ| ŷþһ| 777þµַ| ޹Ƶþ| ɫۺϾþþþ| ղƷþþþþþɫ| þùۺϾƷ|