在设计实现一个系统的时候,用户登录界面的设计可以说是必不可少的环节,而用户登录界面的实现说到底就是不同窗口之间的切换。
在继续下面的工作之前,你首先要添加一个新的Qt设计师界面类,记住要选择Dialog without Buttons! 否则方法一无法实现。


注:下面的代码只是核心部分,不是完整的代码,需要各位看官自己增删改以达到想要的效果,代码供参考。
方法一:利用QDialog的exec()
main.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow welcomeWindow;//创建主窗口
LoginDialog login;//创建登录对话框
login.show();
//如果登录对话框产生一个accept事件,则显示主窗口
if(login.exec()==QDialog::Accepted){
welcomeWindow.show();
}
return a.exec();
}logindialog.cpp
void LoginDialog::on_buttonLogin_clicked()
{
QString account = ui->lineAccount->text();//获取用户名文本框的内容
QString inputPassword = ui->lineCode->text();//获取密码文本框的内容
//这里是在数据库的账户信息表进行密码查找
query.exec(QString("select Code from User_Info where Account='%1'").arg(account));
QString password;
while(query.next())
{
password = query.value("Code").toString();
}
//密码为空,说明没有该用户
if(password.isEmpty()){
QMessageBox::warning(this,"登录失败","用户名不存在,请检查");
ui->lineAccount->clear();
ui->lineCode->clear();
ui->lineAccount->setFocus();
}
//用户存在,但是密码不正确
else if(QString::compare(inputPassword,password,Qt::CaseSensitive))
{
QMessageBox::warning(this,"登录失败","密码错误,请检查");
ui->lineAccount->clear();
ui->lineCode->clear();
ui->lineAccount->setFocus();
}
//用户密码均输入正确
else{
QMessageBox::information(this,"登录成功","成功登录!");
accept();//激发accept事件
}
}方法二:利用信号与槽
main.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow welcomeWindow;
LoginDialog login;
login.show();
//使用QT4的方式进行信号与槽函数的connect
//参数一:信号发出者
//参数二:发出的信号
//参数三:信号接收者
//参数四:响应的槽函数
//点击登录对话框的登录按钮,进入主界面
QObject::connect(&login,SIGNAL(mainshow()),&welcomeWindow,SLOT(show_mainwindow()));
//点击主界面的注销,返回登录对话框
QObject::connect(&welcomeWindow,SIGNAL(loginshow()),&login,SLOT(show_loginwindow()));
return a.exec();
}接下来就需要分别声明定义相应的信号和槽函数了。
logindialog.h:声明信号 mainshow() 和槽函数 show_loginwindow()
class LoginDialog : public QDialog
{
Q_OBJECT
public:
explicit LoginDialog(QWidget *parent = 0);
~LoginDialog();
//信号声明的固定格式
signals:
void mainshow();
//槽函数的声明
private slots:
void on_buttonLogin_clicked();
void show_loginwindow();
private:
Ui::LoginDialog *ui;
};
logindialog.cpp:定义槽函数 show_loginwindow()
void LoginDialog::show_loginwindow()
{
this->show();//显示登录对话框
ui->lineAccount->clear();//清空文本框
ui->lineCode->clear();
ui->lineAccount->setFocus();//设置光标
}登录按钮点击事件稍作修改
else{
QMessageBox::information(this,"登录成功","成功登录!");
this->close();//关闭登录对话框
emit mainshow();//发送mainshow信号
}
mymainwindow.h:声明信号 loginshow() 和槽函数 show_mainwindow()
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MyMainWindow(QWidget *parent = 0);
~MyMainWindow();
signals:
void loginshow();
private slots:
void show_mainwindow();
private:
Ui::MyMainWindow *ui;
};mymainwindow.cpp:实现槽函数 show_mainwindow()
void MyMainWindow::show_mainwindow()
{
this->show();//显示主窗口
}
运行效果图

登录界面
总结
两种方法个人更倾向于第二种。第二种方法更加灵活,可以同时实现登入登出的功能。
版权声明:本文为weixin_45138590原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。