一、功能概述
说起右键菜单,之前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 }