QT实现预案管理(增加、编辑、删除、清空),自定义QListWidget Item

一 界面

二 功能

1. 实现预案添加功能。能够保存名称与描述,主要是用QListWidget,界面初始显示六个预案共三个Item。添加相关数据时会按顺序添加,超过六个会新增Item并添加信息到相应顺序的预案框内。

2. 实现删除功能。 点击界面内任一预案框架内的删除键,会删除相应预案并且此预案的下一个预案会替换此预案的位置,以此类推,直至最后一个预案替换到倒数第二个预案。

三 演示

四 源码

这里我用的是QListWidget并且封装了一个ItemWidget类用来代替QT自带的Item,这个类由左右两个Widget组成,两个widget样式相同。并且提供了很多方法:

#ifndef LISTWIDGETITEM_HPP
#define LISTWIDGETITEM_HPP

#include <QWidget>
#include <QPushButton>
#include <QLabel>

class ItemWidget : public QWidget
{
    Q_OBJECT

public:

    ItemWidget(QWidget *parent = 0);
    QString getpreplan1text(); //获取左边Widget预案名称
    QString getdescribeleft(); //获取左边Widget预案描述
    void settext1(QString str1, QString str2); //设置左边预案名称,描述信息
    QString getpreplan2text(); //获取右边Widget预案名称
    QString getdescriberight(); //获取右边Widget预案描述
    void settext2(QString str1, QString ste2); //设置右边预案名称,描述信息
    void setEnabledF1();  //设置左边按钮不可用
    void setEnabledF2();  //设置右边按钮不可用
    void setEnabledT1();  //设置左边按钮可用
    void setEnabledT2();  //设置右边按钮可用
    bool isEmptyLeft();   //判断左边 名称信息是否为空
    bool isEmptyRight();  //判断右边 名称信息是否为空

~ItemWidget();

private:
    QWidget *m_pWidget1;
    QWidget *m_pWidget2;

    QLabel *m_preplan1;
    QLabel *m_describe1;
    QPushButton *m_delButton1;
    QPushButton *m_editButton1;

    QLabel *m_preplan2;
    QLabel *m_describe2;
    QPushButton *m_delButton2;
    QPushButton *m_editButton2;

signals:
    void deleteButtonClicked(QString);
public slots:
    void ondelBT1Clicked();
    void ondelBT2Clicked();

};
#endif // LISTWIDGETITEM_HPP

 

对listwidget中的预案进行整理:

void Dialog::planSort()
{
 //循环查找进行排序
    for(int i=0; i<m_planWidget->count(); i++)
    {
        QWidget* iwi =m_planWidget->itemWidget(m_planWidget->item(i));
        ItemWidget* idgi=dynamic_cast<ItemWidget*>(iwi) ;
        QWidget* iwj =m_planWidget->itemWidget(m_planWidget->item(i+1));
        ItemWidget* idgj=dynamic_cast<ItemWidget*>(iwj) ;
        if(!idgi)
        {
            break;
        }            
   if(idgi->isEmptyLeft() && !idgi->isEmptyRight()) //如果第i个Item左边预案名称信息为空,右边不为空
        {
            idgi->settext1(idgi->getpreplan2text(),idgi->getdescriberight()); //将右边信息替换到左边
            idgi->setEnabledT1();
            idgi->settext2("无预案","预案描述");//右边信息设为空
            idgi->setEnabledF2();
        }
        if(idgi->isEmptyRight()) //如果第i个Item右边为空
        {
            if(!idgj)
            {
                break;
            }
            if(!idgj->isEmptyLeft()) //存在第i+1个Item且其左边不为空
            {
                idgi->settext2(idgj->getpreplan1text(),idgj->getdescribeleft()); //将第i+1个Iem的左边信息替换到第i个的右边
                idgi->setEnabledT2();
                idgj->settext1("无预案","预案描述");
                idgj->setEnabledF1();
            }
        }
    }
    //遍历找出第三个item以后的空item行并删除
    for( int i=3;i<m_planWidget->count();i++)
    {
        QWidget* iwi =m_planWidget->itemWidget(m_planWidget->item(i));
        ItemWidget* idgi=dynamic_cast<ItemWidget*>(iwi) ;
        if(!idgi)
        {
            break;
        }
        if(idgi->isEmptyLeft() && idgi->isEmptyRight())
        {
            m_planWidget->takeItem(i);
        }
    }
    //若第四行为空,删除之
    QWidget* iw4 =m_planWidget->itemWidget(m_planWidget->item(3));
    ItemWidget* idg4=dynamic_cast<ItemWidget*>(iw4) ;
    if(!idg4)
    {
        return;
    }
    if(idg4->isEmptyLeft() && idg4->isEmptyRight())
    {
        m_planWidget->takeItem(3);
    }
}

删除预案代码:

void Dialog::handleDeleteButtonClicked(QString signal)
{
    //删除预案
    ItemWidget* itemw = dynamic_cast<ItemWidget*>(QObject::sender());
    if(!itemw)
        return;
    if(signal == "left")
    {
        itemw->settext1("无预案","预案描述");
        itemw->setEnabledF1();
    }
    if(signal == "right")
    {
        itemw->settext2("无预案","预案描述");
        itemw->setEnabledF2();
    }
    //整理删除后的页面
    planSort();
}

    以上是一个使用QT实现预案管理的功能,由于完整代码比较多就不一一贴出来,感兴趣的可以私信我。

本人接触QT时间不长,若代码有不合理的地方希望大佬能指出,若有更好的实现方法还望指点!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值