很重要--转载声明
- 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
- 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。
Posted 朝十晚八
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt之QAbstractItemView右键菜单相关的知识,希望对你有一定的参考价值。
说起右键菜单,之前Qt之自定义QLineEdit右键菜单这篇文章中我已经讲述过3种右键菜单的实现方式,今儿也是在啰嗦一下,针对QListWidget类在定制一下右键菜单,我使用的具体方式呢,是直接重写了contextMenuEvent方法,在这个方法中弹出右键菜单。
如图1是针对QListWidget定制的右键菜单,美观程度一般,但是功能基本实现
图1 QListWidget右键菜单
右键菜单在相关文章小节中我已经给出了一些文章,关于右键菜单的弹出逻辑我就不在细说了,在这里我就简单说下右键菜单的处理代码
ListItem是定制的item项,使用setItemWidget接口设置为QStandardListWidgetItem项的窗口
1、删除,首先获取当前项,然后获取获取当前项上的窗口,并把其析构
1 void DragList::DeleteSotck() 2 { 3 QListWidgetItem * item = currentItem(); 4 if (item == nullptr) 5 { 6 return; 7 } 8 9 if (ListItem * itemWidget = ItemWidget(item)) 10 { 11 itemWidget->deleteLater(); 12 itemWidget = nullptr; 13 } 14 15 delete item; 16 item = nullptr; 17 }
2、置顶,这个操作需要注意,如果当前项已经是第一个,那么不需要做任何处理
1 void DragList::TopSotck() 2 { 3 QListWidgetItem * item = currentItem(); 4 if (item == nullptr) 5 { 6 return; 7 } 8 9 if (row(item) == 0) 10 { 11 return; 12 } 13 14 ListItem * itemWidget = ItemWidget(item); 15 QListWidgetItem * newItem = takeItem(row(item)); 16 insertItem(0, newItem); 17 ListItem * topWidget = new ListItem; 18 topWidget->SetData(itemWidget->GetData()); 19 setItemWidget(newItem, topWidget); 20 21 if (itemWidget) 22 { 23 delete itemWidget; 24 itemWidget = nullptr; 25 } 26 setCurrentItem(newItem); 27 }
3、置低,同样的道理,如果当前项是最后一个,那么也不需要做处理
1 void DragList::BottomSotck() 2 { 3 QListWidgetItem * item = currentItem(); 4 if (item == nullptr) 5 { 6 return; 7 } 8 9 if (row(item) == count() - 1) 10 { 11 return; 12 } 13 14 ListItem * itemWidget = ItemWidget(item); 15 QListWidgetItem * newItem = takeItem(row(item)); 16 addItem(newItem); 17 ListItem * bottomWidget = new ListItem; 18 bottomWidget->SetData(itemWidget->GetData()); 19 setItemWidget(newItem, bottomWidget); 20 21 if (itemWidget) 22 { 23 delete itemWidget; 24 itemWidget = nullptr; 25 } 26 setCurrentItem(newItem); 27 }
4、上移一位
1 void DragList::UpSotck() 2 { 3 QListWidgetItem * item = currentItem(); 4 if (item == nullptr) 5 { 6 return; 7 } 8 9 int itemRow = row(item); 10 if (itemRow == 0) 11 { 12 return; 13 } 14 15 ListItem * itemWidget = ItemWidget(item); 16 QListWidgetItem * newItem = takeItem(row(item)); 17 insertItem(itemRow - 1, newItem); 18 ListItem * upWidget = new ListItem; 19 upWidget->SetData(itemWidget->GetData()); 20 setItemWidget(newItem, upWidget); 21 22 if (itemWidget) 23 { 24 delete itemWidget; 25 itemWidget = nullptr; 26 } 27 28 setCurrentItem(newItem); 29 }
5、下移一位
1 void DragList::DownSotck() 2 { 3 QListWidgetItem * item = currentItem(); 4 if (item == nullptr) 5 { 6 return; 7 } 8 9 int itemRow = row(item); 10 if (itemRow == count() - 1) 11 { 12 return; 13 } 14 15 ListItem * itemWidget = ItemWidget(item); 16 QListWidgetItem * newItem = takeItem(row(item)); 17 insertItem(itemRow + 1, newItem); 18 ListItem * downWidget = new ListItem; 19 downWidget->SetData(itemWidget->GetData()); 20 setItemWidget(newItem, downWidget); 21 22 if (itemWidget) 23 { 24 delete itemWidget; 25 itemWidget = nullptr; 26 } 27 setCurrentItem(newItem); 28 }
以上是关于Qt之QAbstractItemView右键菜单的主要内容,如果未能解决你的问题,请参考以下文章
Qt:如何处理 QAbstractItemView 的焦点变化
如何在 Qt 中将 QGraphicsEffect 添加到 QAbstractItemView?