Qt中使用QToolBox实现抽屉效果

Wesley13
• 阅读 778
#ifndef DRAWER_HPP
#define DRAWER_HPP

#include <QToolBox>
#include <QLayout>
#include "listwidget.hpp"
#include "listwidgetitem.hpp"

class Drawer : public QToolBox
{
    Q_OBJECT
public:
    Drawer(const QIcon &iconOpen, const QIcon &iconClose, QWidget *parent = 0,Qt::WindowFlags f = 0);

    void setSpacing(int value) {
        layout()->setSpacing(value);
    }

    /**
     * @brief addErea 在drawer中开辟一块区域
     * @param lable
     */
    void addErea(const QString &label);
    /**
     * @brief addEreaElem 向指定的区域中添加一个元素
     * @param _index 区域下标 从零开始
     * @param item 元素
     */
    void addEreaElem(int _index, QListWidgetItem *item);

    /**
     * @brief addEreaElem 向指定的区域中添加一个元素
     * @param _index 区域名称 
     * @param item 元素
     */
    void addEreaElem(const QString &label, QListWidgetItem *item);


signals:
    /**
     * @brief sig_click 那个区域的那个元素被点击
     * @param ereaIndex 区域下标
     * @param elemIndex 元素下标
     */
    void sig_click(int ereaIndex, int elemIndex);
public slots:

private slots:
    void slt_elemClick(QModelIndex _index);

    /**
     * @brief slt_currentIndexActive 当前的那个区域是活动的,来来改变图标
     * @param _index
     */
    void slt_currentIndexActive(int _index);
private:
    /**
     * @brief openIcon 
     */
    QIcon openIcon;
    /**
     * @brief closeIcon
     */
    QIcon closeIcon;
    /**
     * @brief preIndex 前一个活动区域的下标
     */
    int preIndex;

    QMap<QString,QListWidget*> ereaLabels;



    
};

#endif // DRAWER_HPP



#include "drawer.hpp"

Drawer::Drawer(const QIcon &iconOpen, const QIcon &iconClose, QWidget *parent, Qt::WindowFlags f) :
    QToolBox(parent, f),
    openIcon(iconOpen),
    closeIcon(iconClose),
    preIndex(-1)
{
    connect(this,SIGNAL(currentChanged(int)),this,SLOT(slt_currentIndexActive(int)));
}

void Drawer::slt_currentIndexActive(int _index)
{
    if (preIndex != -1) {
        setItemIcon(preIndex,closeIcon);
    }
    setItemIcon(_index,openIcon);
    preIndex = _index;
}

void Drawer::addErea(const QString &label)
{
    if (!ereaLabels.contains(label)) {
        ListWidget *erea = new ListWidget();
        connect(erea,SIGNAL(clicked(QModelIndex)),this,SLOT(slt_elemClick(QModelIndex)));
        int index = addItem(static_cast<QWidget*>(erea),label);
        setItemIcon(index,openIcon);
        ereaLabels.insert(label,erea);
    }

}

void Drawer::addEreaElem(const QString &label, QListWidgetItem *item)
{
    if (ereaLabels.contains(label)) {
        QListWidget *w = ereaLabels[label];
        w->addItem(item);
    } else {
        delete item;
    }
}

void Drawer::addEreaElem(int _index, QListWidgetItem *item)
{
    QWidget *w  = widget(_index);
    if (w) {
        static_cast<QListWidget*>(w)->addItem(item);
    }

}

void Drawer::slt_elemClick(QModelIndex _index)
{
    int i = _index.row();
    QWidget * w = static_cast<QWidget*> (sender());
    int j = indexOf(w);
    emit sig_click(j,i);
}

Qt中使用QToolBox实现抽屉效果

其中继承了QListWidget和QListWIdgetItem来提供一些特殊的实现,不过演示的时候没有用。

还有一个问题就是QListWidget除了项之外,还有好多的空白项

代码:http://www.kuaipan.cn/file/id\_45404676266394511.htm

修复一个bug

void Drawer::addErea(const QString &label)
{
    if (!ereaLabels.contains(label)) {
        ListWidget *erea = new ListWidget();
        connect(erea,SIGNAL(clicked(QModelIndex)),this,SLOT(slt_elemClick(QModelIndex)));
        int index = addItem(static_cast<QWidget*>(erea),label);//当添加第一个时,回触发currentChanged信号,再回到这里时,图标为close,其实是open
        if (index != 0) {
            setItemIcon(index,closeIcon);
        }
        ereaLabels.insert(label,erea);
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
3年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Github标星5300+,专门为程序员开发文档开源管理系统,我粉了
!(https://oscimg.oschina.net/oscnet/a11909a041dac65b1a36b2ae8b9bcc5c432.jpg)码农那点事儿关注我们,一起学习进步!(https://oscimg.oschina.net/oscnet/f4cce1b7389cb00baaab228e455da78d0
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这