一、功能概述

说起右键菜单,之前Qt之自定义QLineEdit右键菜单这篇文章中我已经讲述过3种右键菜单的实现方式,今儿也是在啰嗦一下,针对QListWidget类在定制一下右键菜单,我使用的具体方式呢,是直接重写了contextMenuEvent方法,在这个方法中弹出右键菜单。

二、效果展示

如图1是针对QListWidget定制的右键菜单,美观程度一般,但是功能基本实现

图1 QListWidget右键菜单

三、代码讲解

右键菜单在相关文章小节中我已经给出了一些文章,关于右键菜单的弹出逻辑我就不在细说了,在这里我就简单说下右键菜单的处理代码

ListItem是定制的item项,使用setItemWidget接口设置为QStandardListWidgetItem项的窗口

1、删除,首先获取当前项,然后获取获取当前项上的窗口,并把其析构

 void DragList::DeleteSotck()
{
QListWidgetItem * item = currentItem();
if (item == nullptr)
{
return;
} if (ListItem * itemWidget = ItemWidget(item))
{
itemWidget->deleteLater();
itemWidget = nullptr;
} delete item;
item = nullptr;
}

2、置顶,这个操作需要注意,如果当前项已经是第一个,那么不需要做任何处理

 void DragList::TopSotck()
{
QListWidgetItem * item = currentItem();
if (item == nullptr)
{
return;
} if (row(item) == )
{
return;
} ListItem * itemWidget = ItemWidget(item);
QListWidgetItem * newItem = takeItem(row(item));
insertItem(, newItem);
ListItem * topWidget = new ListItem;
topWidget->SetData(itemWidget->GetData());
setItemWidget(newItem, topWidget); if (itemWidget)
{
delete itemWidget;
itemWidget = nullptr;
}
setCurrentItem(newItem);
}

3、置低,同样的道理,如果当前项是最后一个,那么也不需要做处理

 void DragList::BottomSotck()
{
QListWidgetItem * item = currentItem();
if (item == nullptr)
{
return;
} if (row(item) == count() - )
{
return;
} ListItem * itemWidget = ItemWidget(item);
QListWidgetItem * newItem = takeItem(row(item));
addItem(newItem);
ListItem * bottomWidget = new ListItem;
bottomWidget->SetData(itemWidget->GetData());
setItemWidget(newItem, bottomWidget); if (itemWidget)
{
delete itemWidget;
itemWidget = nullptr;
}
setCurrentItem(newItem);
}

4、上移一位

 void DragList::UpSotck()
{
QListWidgetItem * item = currentItem();
if (item == nullptr)
{
return;
} int itemRow = row(item);
if (itemRow == )
{
return;
} ListItem * itemWidget = ItemWidget(item);
QListWidgetItem * newItem = takeItem(row(item));
insertItem(itemRow - , newItem);
ListItem * upWidget = new ListItem;
upWidget->SetData(itemWidget->GetData());
setItemWidget(newItem, upWidget); if (itemWidget)
{
delete itemWidget;
itemWidget = nullptr;
} setCurrentItem(newItem);
}

5、下移一位

 void DragList::DownSotck()
{
QListWidgetItem * item = currentItem();
if (item == nullptr)
{
return;
} int itemRow = row(item);
if (itemRow == count() - )
{
return;
} ListItem * itemWidget = ItemWidget(item);
QListWidgetItem * newItem = takeItem(row(item));
insertItem(itemRow + , newItem);
ListItem * downWidget = new ListItem;
downWidget->SetData(itemWidget->GetData());
setItemWidget(newItem, downWidget); if (itemWidget)
{
delete itemWidget;
itemWidget = nullptr;
}
setCurrentItem(newItem);
}

四、示例代码

Qt之QAbstractItemView视图右键菜单

五、相关文章

Qt之自定义QLineEdit右键菜单

qt之菜单项定制

Qt 弹出式菜单阴影

Qt之默认菜单语言设置

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

 

很重要--转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

最新文章

  1. ubuntu 16.04安装docker
  2. Alljoyn之管中窥豹
  3. 【PCB】电子元件封装大全及封装常识
  4. HTTP负载测试——Tsung
  5. Bootstrap页面布局14 - BS按钮群组
  6. BLE Device Monitor
  7. Java 多线程中run() 与 start() 的不同
  8. EF多数据库预热
  9. C#基础(二)——C#中的构造函数
  10. tomcat中的URL参数为中文,servlet接收后显示乱码
  11. oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)
  12. 完美解决夏天电脑cpu发烫问题
  13. 蓝桥网试题 java 入门训练 A+B问题
  14. Python day 7(1) 模块
  15. C#反射调用方法实例
  16. ajax 小练习
  17. Python的浮点数损失精度问题
  18. vue全家桶(vue-cli,vue-router,vue-resource,vuex)-1
  19. python-Django-01基础配置
  20. Selenium之Css Selector使用方法

热门文章

  1. Gradle 构建 android 应用常见问题解决指南
  2. quick -- 创建精灵和动作
  3. Scala 深入浅出实战经典 第46讲: ClassTag 、Manifest、ClasMainifest TagType实战
  4. Codeforces Round #379 (Div. 2) D. Anton and Chess 水题
  5. asp.net中TreeView的大数据加载速度优化
  6. Two classes have the same XML type name 排错【转】
  7. Intellij idea 乱码问题(英文操作系统)
  8. 面向.Net程序员的dump分析
  9. ARCGIS10.1 GeoDatabase深入理解:客户端连接与退出地理数据库时系统表的初始化
  10. 个人软件过程5 git命令行方式超简洁教程