QT杂记(三)员工管理系统

这两天在用QT做一个员工管理系统,里面牵涉到不少之前没细想过的问题,记录下来以便以后查阅

先把需要放出来:

QT杂记(三)员工管理系统_第1张图片

(一)两个没有关系的窗口间怎么传递信息

一开始是做客户端的,遇到的第一个问题是,作为普通用户,登陆之后跳转到用户界面,这时候怎么发送信息给服务器端,让服务器端知道自己是谁?(即当前用户名)而管理员可以查看所有用户信息,因此不需考虑这一点。

网上大多数的窗口间通信都是三种,父子窗口相互通信或者兄弟窗口。但是在这个项目里,登陆界面和用户操作界面并没有关系,而且登陆界面在登陆完成后要关闭,这就无法使用一般的通信了。

最后的解决办法是:创建一个文件专门存放当前用户名。

用QFile新建一个文件,并在登陆界面窗口的构造函数中打开并将其清空,而登陆成功时就将用户名写入该文件。后续需要用到当前用户名的窗口都可以打开读取。

(二)读取当前用户文件为空

这个其实是上面第一个问题衍生出来的一个bug。在QT使用中,我们一般不怎么主动调用file.close()这个函数,因为C++中类的析构函数会帮我们自动关闭。但是在这个项目的情景中,登陆界面接受到服务器端发来的登陆成功信号就会马上开打用户操作界面,然后再调用this->close()关闭。而读取当前用户名文件是写在每个窗口的构造函数中,登陆窗口中调用时就会马上去读文件,这个时候登录窗口还没有关闭,也没有关闭文件。因此读出来的用户名就是空的。登陆界面调用新窗口代码如下:

QMessageBox::information(this, "成功", "登陆成功");
        //打开用户本记录当前用户
        QFile file("User.txt");
        if(!file.open(QIODevice::WriteOnly))
        {
            QMessageBox::warning(this, "error", "打开用户本出错");
        }
        QDataStream in(&file);
        in<show();
        this->close();

解决的方法也很简单,在放入用户名之后,主动调用file.close()函数就可以了。改正后的代码如下:

QMessageBox::information(this, "成功", "登陆成功");
        //打开用户本记录当前用户
        QFile file("User.txt");
        if(!file.open(QIODevice::WriteOnly))
        {
            QMessageBox::warning(this, "error", "打开用户本出错");
        }
        QDataStream in(&file);
        in<show();
        this->close();

 

你可能感兴趣的:(QT,C++)