一 界面
二 功能
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时间不长,若代码有不合理的地方希望大佬能指出,若有更好的实现方法还望指点!!!