运行起来的视频效果如下:关键字: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槽函数:

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、运行起来的视频效果如下:
视频加载中...