运行起来的视频效果如下:关键字:QTreeWidget、setData、数据结构

1、在QTreeWidget控件的编程过程中,常用的用户需求是增加右键点击菜单,比如代码如下;

voidMainWindow::initPage()

{

mAddEquip=newQAction(this);

mAddEquip->setText("新增设备");

connect(mAddEquip,SIGNAL(triggered()),this,SLOT(AddEquip()));

mUpdateEquip=newQAction(this);

mUpdateEquip->setText("修改设备");

connect(mUpdateEquip,SIGNAL(triggered()),this,SLOT(UpdateEquip()));

mDelEquip=newQAction(this);

mDelEquip->setText("删除设备");

connect(mDelEquip,SIGNAL(triggered()),this,SLOT(DelEquip()));

mAddChannel=newQAction(this);

mAddChannel->setText("新增通道");

connect(mAddChannel,SIGNAL(triggered()),this,SLOT(AddChannel()));

mUpdateChannel=newQAction(this);

mUpdateChannel->setText("修改通道");

connect(mUpdateChannel,SIGNAL(triggered()),this,SLOT(UpdateChannel()));

mDelChannel=newQAction(this);

mDelChannel->setText("删除通道");

connect(mDelChannel,SIGNAL(triggered()),this,SLOT(DelChannel()));

mCanvas=newCanvas;

ui->widgetLayout->addWidget(mCanvas);

}

其中connect的槽函数是每个菜单的点击响应函数;

2、在MainWindow.ui的设置中,把属性ContextMenuPolicy设置成CustomContextMenu,并添加customContextMenuRequested槽函数:

七、QTreeWidget的右键点击菜单及节点包含数据结构(送完整源码)

3、在QTreeWidget控件的编程过程中,用数据结构保存到QTreeWidget的节点中,可以很方便地控制节点的信息处理,比如在工程中定义一个结构体:

structTreeData{

intlevel;

intequipID;

intdataID;

};

Q_DECLARE_METATYPE(TreeData);

3、在添加QTreeWidget节点时,添加如下代码,就可将节点与节点信息绑定在一起:

mTreeItem=newQTreeWidgetItem(ui->treeWidget,QStringList("设备列表"));

TreeDatamTreeData;

memset(&mTreeData,0,sizeof(TreeData));

mTreeData.level=0;

mTreeData.equipID=-1;

mTreeData.dataID=-1;

QVariantvar;

var.setValue(mTreeData);

mTreeItem->setData(0,Qt::UserRole,var);

4、由于QTreeWidget的每个节点都带有相应的信息,这样我们就可以很方便地控制节点右键点击响应,代码如下:

voidMainWindow::on_treeWidget_customContextMenuRequested(constQPoint&pos)

{

curItem=ui->treeWidget->itemAt(pos);

if(curItem==NULL)

{

}else

{

QVariantvar=curItem->data(0,Qt::UserRole);

TreeDatamTreeData;

memset(&mTreeData,0,sizeof(TreeData));

mTreeData=var.value<TreeData>();

intlevel=mTreeData.level;

curEquipID=mTreeData.equipID;

curDataID=mTreeData.dataID;

if(level==0)

{

QMenu*popMenu=newQMenu(this);

popMenu->addAction(mAddEquip);

popMenu->exec(QCursor::pos());

}elseif(level==1)

{

QMenu*popMenu=newQMenu(this);

popMenu->addAction(mUpdateEquip);

popMenu->addAction(mDelEquip);

popMenu->addSeparator();

popMenu->addAction(mAddChannel);

popMenu->exec(QCursor::pos());

}else

{

QMenu*popMenu=newQMenu(this);

popMenu->addAction(mUpdateChannel);

popMenu->addAction(mDelChannel);

popMenu->exec(QCursor::pos());

}

}

}

5、运行起来的视频效果如下:

视频加载中...

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。