QItemDelegate中遇到的问题。

yuanxiazai4 2014-01-22 10:21:40
使用QTreeView来显示数据,CTreeModeBase从QAbstractTableModel派生,

QModelIndex CTreeModeBase::index(int row, int column, const QModelIndex &parent) const
{
if (TRUE == this->hasIndex(row, column, parent))
{
if (FALSE == parent.isValid())
{
CTreemodelNode* lpItem = m_lpTreeRoot->GetInfoByRow(row);
return this->createIndex(row, column, lpItem);
}
CTreemodelNode* lpItem = static_cast<CTreemodelNode*>(parent.internalPointer());
if (NULL != lpItem)
{
CTreemodelNode* lpSubItem = lpItem->GetChildByIndex(row);
return this->createIndex(row, column, lpSubItem);
}
}
return QModelIndex();
}

QModelIndex CTreeModeBase::parent(const QModelIndex &index) const
{
if (TRUE == index.isValid())
{
CTreemodelNode* lpchildItem = static_cast<CTreemodelNode*>(index.internalPointer());
CTreemodelNode* lpparentItem = lpchildItem->GetParent();
if (NULL != lpparentItem)
{
return this->createIndex(0, 0, lpparentItem);
}
}
return QModelIndex();
}

这里的static_cast<CTreemodelNode*>(index.internalPointer())能正确换取。
初始化函数是这样写的

m_lpTreeMember = new QTreeView(this);
m_lpTreeMember->setEditTriggers(QAbstractItemView::SelectedClicked);
m_lpParamProxyModel = new QSortFilterProxyModel;
m_lpParamProxyModel->setDynamicSortFilter(true);
m_lpTreeMember->setModel(m_lpParamProxyModel);

QStringList strHeaderList;
strHeaderList << tr("type") << tr("name");
m_lpTreeModel = new CTreeModeBase(strHeaderList, m_lpTreeMember);
m_lpParamProxyModel->setSourceModel(m_lpTreeModel);
m_lpTreeModel->SetRootInfo(m_lpRoot);
m_lpTestDelegate = new CTestDelegate(m_lpTreeMember);
m_lpTreeMember->setItemDelegate(m_lpTestDelegate);
m_lpTreeMember->show();

然后问题出来了。
CTestDelegate从QItemDelegate派生, 我想在createEditor函数中通过参数QModelIndex通过 static_cast<CTreemodelNode*>(index.internalPointer())获取信息,为什么获取到的信息是错误的。

QWidget* CTestDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (0 == index.column())
{
CTreemodelNode* lpItem = static_cast<CTreemodelNode*>(index.internalPointer());
if (PARAM_NAME_TYPE == lpItem->GetNodeType())
{
CDataEdit* lpEditor = new CDataEdit(parent);
return lpEditor;
}
else if (ATTACH_NAME_TYPE == lpItem->GetNodeType())
{
return NULL;
}
}
return new QLineEdit(parent);
}


我是想通过获取的CTreemodelNode* lpItem中NodeType的不同,来实现生成不同的控件。
请问下应该怎么处理,或者有什么其他的方法达到需求?
...全文
593 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyq5945 2014-01-23
  • 打赏
  • 举报
回复
yuanxiazai4 2014-01-23
  • 打赏
  • 举报
回复
自己解决了。。
yuanxiazai4 2014-01-22
  • 打赏
  • 举报
回复
新学的QT。

16,225

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧