• 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之自定义QLineEdit右键菜单

        qt之菜单项定制

        Qt 弹出式菜单阴影

        Qt之默认菜单语言设置

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

     

      


    很重要--转载声明

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

  • 相关阅读:
    “奇葩”控件向后台传数据
    借助cookie实现子网页修改父网页内容遇到的问题:同一个浏览器访问相同页面,会互相影响。 (已解决)
    JS 怎么控制某个div的滚动条滚动到顶部? (已解决)
    怎么在表单提交前检查数据输入。
    table布局, td内部元素溢出边界问题。 (已解决)
    怎么在两个内嵌的子网页之间通信?(已解决)
    关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
    怎么使用CKEDITOR
    新问题:关于网页中的文本框在手机上受软键盘弹出的影响问题。(已解决)
    Oracle多行查询(函数)
  • 原文地址:https://www.cnblogs.com/swarmbees/p/6055869.html
Copyright © 2020-2023  润新知