码迷,mamicode.com
首页 > 其他好文 > 详细

Qt之QAbstractItemView右键菜单

时间:2016-11-12 09:37:16      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:注意   abs   实现   idg   top   技术分享   code   widget   dia   

一、功能概述

    说起右键菜单,之前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之自定义QLineEdit右键菜单

    qt之菜单项定制

    Qt 弹出式菜单阴影

    Qt之默认菜单语言设置

Qt之QAbstractItemView右键菜单

标签:注意   abs   实现   idg   top   技术分享   code   widget   dia   

原文地址:http://www.cnblogs.com/swarmbees/p/6055869.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!