任务要求:依据给定的用户名,用户密码,用户权限,实现用户的删除,浏览与修改
实现思路:不使用ui,定义窗体类,用代码添加控件,并实现功能。
实现效果:
主函数的定义如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//-----------用户管理查询
UserQuery* userQuery =new UserQuery;
QList<QString> userName;
QList<QString> password;
QList<int> permission={1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
userName<<"Mary"<<"Mike"<<"Jack"<<"Alice"<<"Rose"<<"Jane"<<"Apple"<<"Orange"<<"Peach"<<"Tree";
userName<<"Mary2"<<"Mike2"<<"Jack2"<<"Alice2"<<"Rose2"<<"Jane2"<<"Apple2"<<"Orange2"<<"Peach2"<<"Tree2";
password<<"123"<<"456"<<"456"<<"456"<<"456"<<"456"<<"456"<<"456"<<"456"<<"456";
password<<"123"<<"111"<<"222"<<"333"<<"434"<<"555"<<"666"<<"777"<<"888"<<"999";
userQuery->DisplayUserInfo(userName,password,permission);
userQuery->show();
return a.exec();
}
窗体类的头文件定义如下:
class UserQuery : public QWidget
{
Q_OBJECT
public:
explicit UserQuery(QWidget *parent = nullptr);
~UserQuery();
void DisplayUserInfo(QList<QString> userName,QList<QString> userPassword);
void DisplayUserInfo(QList<QString> userName,QList<QString> userPassword,QList<int> permission);
void InitTalbeWidget();
void deleteButtons();
void displayBtnVec();
void showTableData();
private:
QTableWidget* table_user;
QVector<QTableWidgetItem*> listTem;
QFont nullFont;
QVector<QPushButton*> btnVec;
signals:
void SendDeleteUserInfo(QString userName,QString userPassword); //发送删除信号
void SendModifyUserInfo(QString userName,QString userPassword); //发送修改信号,带2个参数
void SendModifyUserInfo(QString userName,QString userPassword,int permission);//发送修改信号,带3个参数
public slots:
void on_BtnDel_clicked();
void on_BtnUpdate_clicked();
void close();
};
窗体类的实现文件定义如下:
extern bool vilidatePwd(QString str);
UserQuery::UserQuery(QWidget *parent) : QWidget(parent)
{
qDebug()<<"UserQuery";
setFixedSize(500,400);
this->setWindowTitle("查看用户");
this->setWindowFlags(~windowFlags() & Qt::WindowMaximized & Qt::WindowStaysOnTopHint);
this->setAttribute(Qt::WA_DeleteOnClose,true);//设置当单击关闭按钮时,释放创建的窗口的内存空间
nullFont.setPixelSize(16);
InitTalbeWidget();
}
void UserQuery::InitTalbeWidget()
{
//table_user->verticalHeader();
table_user=new QTableWidget(this);
table_user->setColumnCount(5);
QStringList strs={"用户名","密码","权限","删除","更新"};
table_user->setHorizontalHeaderLabels(strs);
QFont font = table_user->horizontalHeader()->font();
font.setBold(true);
font.setPixelSize(16);
table_user->horizontalHeader()->setFont(font);
table_user->setColumnWidth(0,100);
table_user->setColumnWidth(1,100);
table_user->setColumnWidth(2,100);
table_user->setColumnWidth(3,100);
table_user->setColumnWidth(4,100);
table_user->setGeometry(0,0,width(),height());
table_user->horizontalHeader()->setStretchLastSection(true);
table_user->verticalHeader()->setVisible(false); //隐藏列表头
}
void UserQuery::DisplayUserInfo(QList<QString> userName,QList<QString> userPassword)
{
table_user->clearContents();
if(!btnVec.isEmpty())
btnVec.clear();
int rows=userName.size();
int rowsPwd=userPassword.size();
if(rows!=rowsPwd )//如果用户数量和密码数量不相等,则退出循环调用
return;
table_user->setRowCount(rows);
for(int i=0;i<rows;i++)
{
QTableWidgetItem *nameItem = new QTableWidgetItem(tr("%1").arg(userName.at(i)));
nameItem->setFlags(nameItem->flags() & (~Qt::ItemIsEditable));//第一列不可编辑
nameItem->setFont(nullFont);
nameItem->setTextAlignment(Qt::AlignCenter);
table_user->setItem(i, 0, nameItem);
QTableWidgetItem *pwdItem = new QTableWidgetItem(tr("%1").arg(userPassword.at(i)));
pwdItem->setTextAlignment(Qt::AlignCenter);
pwdItem->setFont(nullFont);
table_user->setItem(i, 1, pwdItem);
QPushButton* btnDel=new QPushButton("删除");
btnDel->setFont(nullFont);
btnDel->setObjectName(QString::number(i));
table_user->setCellWidget(i,3,btnDel);
btnVec.push_back(btnDel);
QPushButton* btnUpdate=new QPushButton("修改");
btnUpdate->setFont(nullFont);
table_user->setCellWidget(i,4,btnUpdate);
btnVec.push_back(btnUpdate);
connect(btnDel,SIGNAL(clicked()),this,SLOT(on_BtnDel_clicked()));
connect(btnUpdate,SIGNAL(clicked()),this,SLOT(on_BtnUpdate_clicked()));
}
table_user->show();
}
void UserQuery::DisplayUserInfo(QList<QString> userName,QList<QString> userPassword,QList<int> permission)
{
table_user->clearContents();//再次显示前先清理掉表格中上次的数据
qDebug()<<"before deletButtons():"<<btnVec.size();
displayBtnVec();
deleteButtons();//再次显示前先清理掉向量中上次动态申请的内存
if(!btnVec.isEmpty())//再次显示前先清理掉向量中上次记录的按钮的地址数据
btnVec.clear();
qDebug()<<"after deletButtons():"<<btnVec.size();
int rows=userName.size();
int rowsPwd=userPassword.size();
int rowsPermission=permission.size();
//如果传入的参数个数不相等,就不再显示数据
if(rows!=rowsPwd || rows!=rowsPermission || rowsPwd != rowsPermission)
return;
table_user->setRowCount(rows);//设置表格的行数为出入的参数向量的元素个数
for(int i=0;i<rows;i++)
{
QTableWidgetItem *nameItem = new QTableWidgetItem(tr("%1").arg(userName.at(i)));
nameItem->setFlags(nameItem->flags() & (~Qt::ItemIsEditable));//第一列不可编辑
nameItem->setFont(nullFont);
nameItem->setTextAlignment(Qt::AlignCenter);
table_user->setItem(i, 0, nameItem);
QTableWidgetItem *pwdItem = new QTableWidgetItem(tr("%1").arg(userPassword.at(i)));
pwdItem->setTextAlignment(Qt::AlignCenter);
pwdItem->setFont(nullFont);
table_user->setItem(i, 1, pwdItem);
QTableWidgetItem *permissionItem = new QTableWidgetItem(tr("%1").arg(permission.at(i)));
permissionItem->setTextAlignment(Qt::AlignCenter);
permissionItem->setFont(nullFont);
table_user->setItem(i, 2, permissionItem);
QPushButton* btnDel=new QPushButton("删除");
btnDel->setFont(nullFont);
btnDel->setObjectName(QString::number(i));
table_user->setCellWidget(i,3,btnDel);
btnVec.push_back(btnDel);
QPushButton* btnUpdate=new QPushButton("修改");
btnUpdate->setFont(nullFont);
table_user->setCellWidget(i,4,btnUpdate);
btnVec.push_back(btnUpdate);
connect(btnDel,SIGNAL(clicked()),this,SLOT(on_BtnDel_clicked()));
connect(btnUpdate,SIGNAL(clicked()),this,SLOT(on_BtnUpdate_clicked()));
}
table_user->show();
}
void UserQuery::on_BtnDel_clicked()
{
QPushButton* obj=qobject_cast<QPushButton*>(sender());
int x=obj->frameGeometry().x();
int y=obj->frameGeometry().y();
QModelIndex index=table_user->indexAt(QPoint(x,y));
int row=index.row();
int column=index.column();
qDebug()<<"on_BtnDel_clicked()11"<<row<<column;
QString name;
QString password;
name=table_user->item(row,0)->text();
password=table_user->item(row,1)->text();
qDebug()<<"on_BtnDel_clicked()11"<<row<<column<<name<<password;
if(QMessageBox::question(this,"确认删除","是否真的删除",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
{
emit SendDeleteUserInfo(name,password);//删除信号
qDebug()<<"success";
table_user->removeRow(row);
}
}
void UserQuery::on_BtnUpdate_clicked()
{
QPushButton* obj=qobject_cast<QPushButton*>(sender());
int x=obj->frameGeometry().x();
int y=obj->frameGeometry().y();
QModelIndex index=table_user->indexAt(QPoint(x,y));
int row=index.row();
QString name;
QString password;
int permission;
name=table_user->item(row,0)->text();
password=table_user->item(row,1)->text();
permission=table_user->item(row,2)->text().toUInt();
if(QMessageBox::question(this,"确认修改","是否真的修改?",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
{
emit SendModifyUserInfo(name,password,permission);//发送修改信号
qDebug()<<"success";
}
}
void UserQuery::close()
{
deleteButtons();
table_user->clearContents();
}
void UserQuery::deleteButtons()
{
//释放table_user表格中动态申请的QPushButton
int len=btnVec.length();
for(int i=0;i<len;i++)
{
QPushButton* btnPtr=btnVec.at(i);
if(btnPtr!=nullptr)
{
delete btnPtr;
btnPtr=nullptr;
}
}
}
void UserQuery::displayBtnVec()
{
int len=btnVec.size();
for(int i=0;i<len;i++)
{
QPushButton* btnPtr=btnVec.at(i);
if(btnPtr!=nullptr)
{
qDebug()<<btnPtr;
}
}
}
//输出表格中的数据
void UserQuery::showTableData()
{
QString name;
QString pwd;
int permission;
qDebug()<<"测试表格中的数据是否正确?";
int row=table_user->rowCount();
for(int i=0;i<row;i++)
{
name=table_user->item(i,0)->text();
pwd=table_user->item(i,1)->text();
permission=table_user->item(i,2)->text().toUInt();
qDebug()<<name<<pwd<<permission;
}
}
UserQuery::~UserQuery()
{
deleteButtons();
if(table_user!=NULL)
{
delete table_user;
table_user=nullptr;
}
}
需要完善的地方是,需要自己写一个用户输入有效性验证的函数
extern bool vilidatePwd(QString str);