找回密码
 立即注册
收起左侧

第3篇 基础(三)Qt登录对话框

142
回复
172090
查看
  [复制链接]
累计签到:1609 天
连续签到:1 天
来源: 2013-3-25 19:29:09 显示全部楼层 |阅读模式
Qt登录对话框

版权声明

该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!


导语
       在前一篇的内容中已经实现了登录对话框,这里我们对其进行改进。在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确则进入主窗口,如果有错则弹出警告对话框。

环境是:Windows 7 + Qt 4.8.1+ Qt Creator 2.4.1


目录
一、创建项目
二、登录设置


正文

一、创建项目

1.新建Qt Gui应用,项目名称为“login”,类名和基类保持MainWindowQMainWindow不变。

2.完成项目创建后,向项目中添加新的Qt设计师界面类,模板选择Dialog without Buttons,类名更改为LoginDialog。完成后向界面上添加两个标签Label、两个行编辑器Line Edit和两个按钮Push Button,设计界面如下图所示。

3.这里在属性编辑器中将用户名后面的行编辑器的object Name属性更改为usrLineEdit,密码后面的行编辑器为pwdLineEdit,登录按钮为loginBtn,退出按钮为exitBtn。如下图所示。

4.下面我们使用另外一种信号和槽的关联方法来设置退出按钮。在设计模式下面的信号和槽编辑器中,先点击左上角的绿色加号添加关联,然后选择发送者为exitBtn,信号为clicked(),接收者为LoginDialog,槽为close()。如下图所示。这样,当单击退出按钮时,就会关闭登录对话框。

5.右击登录按钮,在弹出的菜单中选择“转到槽”,然后选择clicked()信号并确定。转到相应的槽以后,添加函数调用:
void LoginDialog::on_loginBtn_clicked()
{
    accept();
}

6.下面到main.cpp文件,更改内容如下:
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "logindialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    LoginDialog dlg;
    if (dlg.exec() == QDialog::Accepted)
    {
       w.show();
       return a.exec();
    }
    else return 0;        
}
7.这时运行程序,按下退出按钮会退出程序,按下登录按钮会关闭登录对话框,并显示主窗口。

二、登录设置

1.下面添加代码来实现使用用户名和密码登录,这里我们只是简单的将用户名和密码设置为了固定的字符串。到logindialog.cpp文件中将登录按钮的单击信号对应的槽的代码更改为:
void LoginDialog::on_loginBtn_clicked()
{
// 判断用户名和密码是否正确,
// 如果错误则弹出警告对话框
    if(ui->usrLineEdit->text() == tr("yafeilinux") &&
           ui->pwdLineEdit->text() == tr("123456"))
    {
       accept();
    } else {
       QMessageBox::warning(this, tr("Waring"),
                             tr("user name or password error!"),
                             QMessageBox::Yes);
    }
}
Qt中的QMessageBox类提供了多种常用的对话框类型,比如这里的警告对话框,还有提示对话框,问题对话框等。这里使用了静态函数来设置了一个警告对话框,这种方式很方便。其中的参数依次是:this表明父窗口是登录对话框;然后是窗口标题;然后是显示的内容;最后一个参数是显示的按钮,这里使用了一个Yes按钮。大家注意还要添加该类的头文件包含,即:#include <QMessageBox>

2.下面运行程序,如果输入用户名为“yafeilinux”,密码为“123456,那么可以登录,如果输入其他的字符,则会弹出警告对话框,如下图所示。

3.对于输入的密码,我们常见的是显示成小黑点的样式。下面点击logindialog.ui文件进入设计模式,然后选中界面上的密码行编辑器,在属性编辑器中将echoMode属性选择为Password。这时再次运行程序,可以看到密码显示已经改变了。如下图所示。

       当然,除了在属性编辑器中进行更改,也可以在loginDialog类的构造函数中使用setEchoMode(QLineEdit::Password)函数来设置。

4.在行编辑器的属性栏中还可以设置占位符,就是没有输入信息前的一些提示语句。例如将密码行编辑器的placeholderText属性更改为“请输入密码”,将用户名行编辑器的更改为“请输入用户名”,运行效果如下图所示。

5.对于行编辑器,还有一个问题就是,比如我们输入用户名,在前面添加了一个空格,这样也可以保证输入是正确的,这个可以使用QString类的trimmed()函数来实现,它可以去除字符串前后的空白字符。下面将logindialog.cpp文件中登录按钮单击信号槽函数中的判断代码更改为:
if(ui->usrLineEdit->text().trimmed() == tr("yafeilinux")
            && ui->pwdLineEdit->text() == tr("123456"))
这时运行程序,已经实现相应的功能了。

6.最后,当登录失败后,我们希望可以清空用户名和密码信息,并将光标定位到用户名输入框中。这个可以通过在判断用户名和密码错误后添加相应的代码来实现:
void LoginDialog::on_loginBtn_clicked()
{
    // 判断用户名和密码是否正确,如果错误则弹出警告对话框
    if(ui->usrLineEdit->text().trimmed() == tr("yafeilinux")
           && ui->pwdLineEdit->text() == tr("123456"))
    {
       accept();
    } else {
       QMessageBox::warning(this, tr("Waring"),
                             tr("user name or password error!"),
                             QMessageBox::Yes);
       // 清空内容并定位光标
       ui->usrLineEdit->clear();
       ui->pwdLineEdit->clear();
       ui->usrLineEdit->setFocus();
    }
}
       下面运行程序,大家可以测试一下效果。

7.这里再补充一个技巧,也就是Qt Creator的代码补全功能。Qt Creator有很强大的代码补全功能,比如输入一个关键字时,只要输入前几个字母,就会弹出相关的关键字的选择列表;输入完一个对象,然后输入点以后,就会弹出该对象所有可用的变量和函数。这里要说的是,当输入一个比较长得函数或变量名时,可以通过其中的几个字母来定位。比如说,要输入前面讲到的setFocus()函数,那么只需输入首字母s和后面的大写字母F即可,这样可以大大缩减提示列表,如果还没有定位到,那么可以输入F后面的字母。如下图所示。

我们还可以使用ctrl + 空格键来强制代码补全,不过这个一般会和我们的输入法的快捷键冲突,大家可以更改输入法的快捷键,也可以在Qt Creator中的工具→选项→环境→键盘中来设置快捷键。

结语
       这一节又讲解了一种信号和槽的关联方法,还讲解了一些部件的属性设置等内容。在Qt Creator快速入门》一书中还讲解了大量常用的部件的使用说明,大家可以参考一下。



涉及到的源码下载:



上一篇:第2篇 编写Qt多窗口程序

下一篇:第4篇 添加菜单图标——使用Qt资源文件

返回:系列教程目录  




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

为什么我在第一、4中设计模式下面的信号和槽编辑器中接收者里面没有LoginDialog,而且5“转到槽…”函数名不是 LoginDialog,而是MainWindow呀  发表于 2016-6-25 12:34
参与人数 14人气 +24 收起 理由
ellen + 2 很详细!
seprana + 2 很详细!
handsome999 + 2 必须支持!
123456aa + 1 对我帮助很大!
buling + 2 对我帮助很大!
hhy + 2 对我帮助很大!
bluewen + 2 很详细!
阿杜 + 2 很详细!
一丝不苟的珊珊 + 1 很详细!
沈公子 + 2
zxj721 + 2 对我帮助很大!
一代菜鸟 + 2 对我帮助很大!
千雨 + 1 很详细!
happyone + 1 很实用!

查看全部评分总评分 : 人气 +24

回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2013-4-5 17:07:55 显示全部楼层
accept();怎么报错,是不是头文件不对

点评

报什么错?  发表于 2013-4-5 23:05
回复 支持 反对

使用道具 举报

尚未签到

2013-4-22 14:57:36 显示全部楼层
jianggl007 发表于 2013-4-5 17:07
accept();怎么报错,是不是头文件不对

如果正确输入会变成斜体.
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2013-4-24 00:11:17 显示全部楼层
请问什么时候能更新QML,很期待!
回复 支持 反对

使用道具 举报

累计签到:1609 天
连续签到:1 天
2013-4-24 09:10:38 显示全部楼层
夏叫兽 发表于 2013-4-24 00:11
请问什么时候能更新QML,很期待!

嗯,计划是先更新完以前的五十篇,不过以前的后面十篇是关于Qt Quick的,这个不再出现在这五十篇里面了。而是将qml作为Qt 5教程的重点推出,也是说后面推出Qt 5教程的时候,主要是qml的内容!
回复 支持 反对

使用道具 举报

尚未签到

2013-5-4 15:23:20 显示全部楼层
{:soso_e100:}看了好多篇帖子,以前都是喜欢用Windows下的VS写的,看来要尝试下在QT下开发小小的Application,希望可以编一个基于QT开发的实时显示波形的应用程序,嘻嘻{:soso_e100:}
回复 支持 反对

使用道具 举报

尚未签到

2013-5-29 22:22:18 显示全部楼层
main.c编译报错,logindilalog和dlg没有声明,是什么情况
回复 支持 反对

使用道具 举报

尚未签到

2013-5-29 22:46:23 显示全部楼层
LoginDialog dlg;
    if (dlg.exec() == QDialog::Accepted)
C:\Qt\qtcreator-2.4.1\login-build-desktop-Qt_4_8_1__4_8_1____\..\login\main.cpp:8: 错误:'LoginDialog' was not declared in this scope            C:\Qt\qtcreator-2.4.1\login-buildQt_4_8_1__4_8_1____\..\login\main.cpp:8: 错误:expected ';' before 'dlg'
回复 支持 反对

使用道具 举报

累计签到:1609 天
连续签到:1 天
2013-5-30 19:26:07 显示全部楼层
zhanglin 发表于 2013-5-29 22:22
main.c编译报错,logindilalog和dlg没有声明,是什么情况

看是否添加了改类的头文件;或者该类是否定义了。
回复 支持 反对

使用道具 举报

累计签到:84 天
连续签到:1 天
2013-6-1 11:34:04 显示全部楼层
为何我的,密码不多,还是可以调到主界面的呢?

main.cpp:
  1. int main(int argc, char *argv[])
  2. {
  3.     QApplication a(argc, argv);
  4.     LoginDialog ld;
  5.     MainWindow w;

  6.     if(ld.exec()==QDialog::Accepted){
  7.         w.show();

  8.         return a.exec();
  9.     }else{
  10.         return 0;
  11.     }
  12. }
复制代码
  1. void LoginDialog::on_pbtnLogin_clicked()
  2. {
  3.     // 判断用户名和密码是否正确,如果错误则弹出警告对话框
  4.         if(ui->usrLineEdit->text().trimmed() == tr("caikeyter")
  5.                && ui->pwdLineEdit->text() == tr("123456"))
  6.         {
  7.            accept();
  8.         } else {
  9.            QMessageBox::warning(this, tr("Waring"),
  10.                                  tr("user name or password error!"),
  11.                                  QMessageBox::Yes);
  12.            // 清空内容并定位光标
  13.            ui->usrLineEdit->clear();
  14.            ui->pwdLineEdit->clear();
  15.            ui->usrLineEdit->setFocus();
  16.         }
  17. }
复制代码
代码和教程的一样啊,为何呢??
回复 支持 反对

使用道具 举报

累计签到:1609 天
连续签到:1 天
2013-6-2 22:20:59 显示全部楼层
caikeyter 发表于 2013-6-1 11:34
为何我的,密码不多,还是可以调到主界面的呢?

main.cpp:代码和教程的一样啊,为何呢?? ...

为何我的,密码不多,还是可以调到主界面的呢?

什么意思?
回复 支持 反对

使用道具 举报

累计签到:84 天
连续签到:1 天
2013-6-3 09:02:12 显示全部楼层
yafeilinux 发表于 2013-6-2 22:20
为何我的,密码不多,还是可以调到主界面的呢?

什么意思?

打错字了,是密码不对,它也会跳到主界面啊。密码不对,应该停留在登陆界面才是的。
回复 支持 反对

使用道具 举报

累计签到:1609 天
连续签到:1 天
2013-6-3 09:40:53 显示全部楼层
caikeyter 发表于 2013-6-3 09:02
打错字了,是密码不对,它也会跳到主界面啊。密码不对,应该停留在登陆界面才是的。 ...

应该不会吧,你用qDebug()输出一下输入的信息,检查一下是哪里有问题。

可以下载源码运行一下试试,看看是否正确。
回复 支持 反对

使用道具 举报

累计签到:84 天
连续签到:1 天
2013-6-3 13:51:19 显示全部楼层
yafeilinux 发表于 2013-6-3 09:40
应该不会吧,你用qDebug()输出一下输入的信息,检查一下是哪里有问题。

可以下载源码运行一下试试,看看 ...

找到问题所在了。因为我在信号和槽编辑器里面 给 登陆 按钮 添加了一个。而您的例子里面是没有的,只给了“退出” 添加 信号和槽。 我不是很明白,登陆 按钮的事件是怎么关联上的??????
回复 支持 反对

使用道具 举报

累计签到:1609 天
连续签到:1 天
2013-6-3 21:52:34 显示全部楼层
caikeyter 发表于 2013-6-3 13:51
找到问题所在了。因为我在信号和槽编辑器里面 给 登陆 按钮 添加了一个。而您的例子里面是没有的,只给了 ...

5.右击登录按钮,在弹出的菜单中选择“转到槽…”,然后选择clicked()信号并确定。转到相应的槽以后,添加函数调用:
void LoginDialog:n_loginBtn_clicked()
{
    accept();
}

这里使用了自动关联,on_loginBtn_clicked()这个命名就已经关联了。在《Qt Creator快速入门》的130页有介绍。
回复 支持 反对

使用道具 举报

累计签到:84 天
连续签到:1 天
2013-6-4 09:23:26 显示全部楼层
yafeilinux 发表于 2013-6-3 21:52
5.右击登录按钮,在弹出的菜单中选择“转到槽…”,然后选择clicked()信号并确定。转到相应的槽以后,添 ...

您的是直接 选择“转到槽”。但是在 “信息和槽编辑器”哪里添加的,效果不一样。昨晚我回家看了那本书了,确实是,通过on_btnname_clicked()这样会自动关联,估计是在编译的时候,关联上了。
回复 支持 反对

使用道具 举报

尚未签到

2013-6-4 19:34:23 显示全部楼层
您好我想问一下 if (dlg.exec() == QDialog::Accepted)中最后的Accepted是函数吗,为什么开头字母大写呢
回复 支持 反对

使用道具 举报

累计签到:1609 天
连续签到:1 天
2013-6-4 22:30:09 显示全部楼层
caikeyter 发表于 2013-6-4 09:23
您的是直接 选择“转到槽”。但是在 “信息和槽编辑器”哪里添加的,效果不一样。昨晚我回家看了那本书了 ...

嗯。那是信号和槽关联的几种不同方式。最终效果是一样的。也就是说一种方法能实现的,其他方法也能实现。
回复 支持 反对

使用道具 举报

累计签到:1609 天
连续签到:1 天
2013-6-4 22:32:01 显示全部楼层
进碗里没 发表于 2013-6-4 19:34
您好我想问一下 if (dlg.exec() == QDialog::Accepted)中最后的Accepted是函数吗,为什么开头字母大写呢 ...

那个是枚举值
回复 支持 反对

使用道具 举报

尚未签到

2013-6-26 17:30:46 显示全部楼层
真的很不错,就这样一步一步进阶吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了