Qt中使用QTableWidget管理用户信息

任务要求:依据给定的用户名,用户密码,用户权限,实现用户的删除,浏览与修改

实现思路:不使用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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值