Qt中使用QToolBox實現抽屜效果

#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);
}



其中繼承了QListWidget和QListWIdgetItem來提供一些特殊的實現,不過演示的時候沒有用。this

還有一個問題就是QListWidget除了項以外,還有好多的空白項code



代碼:http://www.kuaipan.cn/file/id_45404676266394511.htmhtm



修復一個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);
    }
}
相關文章
相關標籤/搜索