• QT(9.1)对话框与事件处理


    作业:

    1.

    完善登录框

    点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。

    如果账号和密码匹配,则弹出信息对话框,给出提示信息为“登录成功”,给出一个按钮ok,点击ok后,关闭整个登录界面,跳转到其他界面

    点击取消按钮后,弹出问题对话框,询问是否确定要退出登录,给出两个按钮,yes|no,点击yes,则直接关闭整个登录界面,如果点击no则进行进行登录

    要求:对象版和静态成员函数版至少各实现一个

    pro文件:

    1. QT += core gui
    2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    3. CONFIG += c++11
    4. # The following define makes your compiler emit warnings if you use
    5. # any Qt feature that has been marked deprecated (the exact warnings
    6. # depend on your compiler). Please consult the documentation of the
    7. # deprecated API in order to know how to port your code away from it.
    8. DEFINES += QT_DEPRECATED_WARNINGS
    9. # You can also make your code fail to compile if it uses deprecated APIs.
    10. # In order to do so, uncomment the following line.
    11. # You can also select to disable deprecated APIs only up to a certain version of Qt.
    12. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
    13. SOURCES += \
    14. main.cpp \
    15. second.cpp \
    16. widget.cpp
    17. HEADERS += \
    18. second.h \
    19. widget.h
    20. # Default rules for deployment.
    21. qnx: target.path = /tmp/$${TARGET}/bin
    22. else: unix:!android: target.path = /opt/$${TARGET}/bin
    23. !isEmpty(target.path): INSTALLS += target
    24. RESOURCES += \
    25. photo.qrc
    26. FORMS += \
    27. second.ui

    登录界面头文件:

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //行编辑器
    5. #include//图标
    6. #include//标签
    7. #include//按钮
    8. #include//图标
    9. #include//调试函数
    10. #include//消息对话框
    11. class Widget : public QWidget
    12. {
    13. Q_OBJECT
    14. public:
    15. Widget(QWidget *parent = nullptr);
    16. ~Widget();
    17. QLabel *lab1;
    18. QLabel *lab2 ;
    19. QLabel *lab3 ;
    20. QLineEdit *dit1;
    21. QLineEdit *dit2 ;
    22. QPushButton *btn1;
    23. QPushButton *btn2;
    24. public slots:
    25. void btn1_slot(); //自定义一个按钮1的槽函数
    26. void btn2_slot(); // 自定义一个按钮2的槽函数
    27. signals:
    28. void jump(); //定义跳转函数
    29. };
    30. #endif // WIDGET_H

    跳转界面头文件:

    1. #ifndef SECOND_H
    2. #define SECOND_H
    3. #include
    4. namespace Ui {
    5. class Second;
    6. }
    7. class Second : public QWidget
    8. {
    9. Q_OBJECT
    10. public:
    11. explicit Second(QWidget *parent = nullptr);
    12. ~Second();
    13. private:
    14. Ui::Second *ui;
    15. public slots:
    16. void jump_slots();//定义一个接收跳转信号的槽
    17. };
    18. #endif // SECOND_H

    实现函数:

    1. #include "widget.h"
    2. Widget::Widget(QWidget *parent)
    3. : QWidget(parent)
    4. {
    5. this->setFixedSize(500,600);//设置窗口固定大小尺寸
    6. this->setWindowTitle("来也匆匆");//设置窗口标题
    7. this->setWindowIcon(QIcon(":/photo/ckbq.jpg"));//设置窗口图标
    8. this->setStyleSheet("background-color:purple");//设置窗口颜色
    9. lab1 = new QLabel(this);//创建一个标签,设置父组件为当前窗口组件
    10. lab1 -> resize(500,200);//设置标签大小
    11. lab1 -> setPixmap(QPixmap(":/photo/bj.jpg"));//标签中添加图片内容
    12. lab1 -> setScaledContents(true);//设置标签内容自适应
    13. lab2 = new QLabel(this);//创建标签,设置父组件为当前窗口组件
    14. lab2 -> resize(40,40);//设置标签大小
    15. lab2 -> move(120,300);//设置标签位置
    16. lab2 -> setPixmap(QPixmap(":/photo/userName.jpg"));
    17. lab2 -> setScaledContents(true);//设置内容自适应
    18. lab3 = new QLabel(this);//创建标签,设置父组件为当前窗口组件
    19. lab3 -> resize(40,40);//设置标签大小
    20. lab3 -> move(lab2->x(),lab2->y()+100);//设置标签位置
    21. lab3 -> setPixmap(QPixmap(":/photo/passwd.jpg"));
    22. lab3 -> setScaledContents(true);//设置标签内容自适应
    23. dit1 = new QLineEdit(this);//创建一个行编辑器,指定父组件
    24. dit1->setPlaceholderText("QQ/手机/邮箱");//设置占位文本
    25. dit1->move(lab2->x()+70,lab2->y());//设置行编辑器位置
    26. dit1->resize(250,40);//设置行编辑器大小
    27. dit1->setStyleSheet("background-color:white");//设置背景颜色
    28. dit2 = new QLineEdit(this);//创建一个行编辑器,父组件为当前窗口组件
    29. dit2->setPlaceholderText("密码");//设置占位文本
    30. dit2->move(lab3->x()+70,lab3->y());
    31. dit2->resize(250,40);//设置行编辑器大小
    32. dit2->setStyleSheet("background-color:white");//设置背景颜色
    33. dit2->setEchoMode(QLineEdit::Password);//设置输入为密文模式
    34. btn1 = new QPushButton("登录",this);//创建一个按钮,设置按钮文本为登录
    35. btn2 = new QPushButton("取消",this);//创建一个按钮,设置按钮文本为取消
    36. btn1->resize(80,40);//设置按钮大小
    37. btn2->resize(80,40);//设置按钮大小
    38. btn1->move(300,500);//设置按钮位置
    39. btn2->move(btn1->x()+100,btn1->y());//设置按钮位置
    40. btn1->setIcon(QIcon(":/photo/login.png"));//设置按钮图标
    41. btn2->setIcon(QIcon(":/photo/cancel.png"));//设置按钮图标
    42. connect(this->btn1,&QPushButton::clicked,this,&Widget::btn1_slot);
    43. connect(this->btn2,SIGNAL(clicked()),this,SLOT(btn2_slot()));
    44. }
    45. void Widget::btn1_slot()
    46. {
    47. QString userName = dit1->text();
    48. QString password = dit2->text();
    49. if(userName=="admin"&&password=="123456")
    50. {
    51. int res = QMessageBox::information(this,
    52. "提示",
    53. "登陆成功",
    54. QMessageBox::Ok|QMessageBox::Cancel,
    55. QMessageBox::Ok);
    56. if(res == QMessageBox::Ok)
    57. {
    58. emit jump();//发送跳转信号
    59. this->close();//关闭界面
    60. }
    61. }
    62. else
    63. {
    64. int res = QMessageBox::critical(this,
    65. "登录失败",
    66. "账号密码不匹配,是否重新登录",
    67. QMessageBox::Yes|QMessageBox::Cancel,
    68. QMessageBox::Yes);
    69. if(res == QMessageBox::Yes)
    70. {
    71. dit2->clear();//清空行编辑器dit2中的内容
    72. }
    73. }
    74. }
    75. void Widget::btn2_slot()
    76. {
    77. QMessageBox box(QMessageBox::Question,
    78. "问题",
    79. "是否要取消登录",
    80. QMessageBox::Yes|QMessageBox::No,
    81. this);
    82. int ret = box.exec();
    83. if(ret == QMessageBox::Yes)
    84. {
    85. this->close();
    86. }
    87. }
    88. Widget::~Widget()
    89. {
    90. }

    跳转界面实现函数:

    1. #include "second.h"
    2. #include "ui_second.h"
    3. Second::Second(QWidget *parent) :
    4. QWidget(parent),
    5. ui(new Ui::Second)
    6. {
    7. ui->setupUi(this);
    8. }
    9. Second::~Second()
    10. {
    11. delete ui;
    12. }
    13. void Second::jump_slots()
    14. {
    15. this->show(); //显示Second中的组件
    16. }

    主函数:

    1. #include "widget.h"
    2. #include "second.h"
    3. #include
    4. int main(int argc, char *argv[])
    5. {
    6. QApplication a(argc, argv);
    7. Widget w;//实例化Widget类对象,取名w
    8. w.show();//调用w中的show函数,显示w中的所有组件
    9. Second s;//实例化Second类对象,取名s
    10. QObject::connect(&w,&Widget::jump,&s,&Second::jump_slots);
    11. //将w中的jump信号函数连接到s中的jump_slots槽函数中
    12. return a.exec();//阻塞等待
    13. }

    2.实现文件对话框的保存功能槽函数:

    1. //保存文件按钮的对应槽函数
    2. void Widget::on_savebtn_clicked()
    3. {
    4. //调用QFileDialog的静态成员函数getSaveFileName来获取选中文件的路径
    5. QString filename = QFileDialog::getSaveFileName(this,
    6. "保存文件",
    7. "./",
    8. "Image File(*.png *.jpg *.bmp);;Text File(*.txt);;All(*.*)"
    9. );
    10. if(filename.isNull())
    11. {
    12. QMessageBox::information(this,"提示","您取消了保存文件");
    13. return;
    14. }
    15. QFile file(filename);//1.实例化一个文件对象
    16. if(!file.open(QFile::WriteOnly))//以只写操作打开文件
    17. {
    18. return;
    19. }
    20. QString buf=ui->textEdit->toPlainText();//2.获取文本编辑器中的纯文本内容
    21. file.write(buf.toLocal8Bit());//3.将文本内容转换成c风格字符串并写入文件中
    22. file.close();//4.关闭文件
    23. }

    3.实现按键盘wsad键实现小球上下左右移动的键盘按下处理函数:

    1. //键盘按下事件处理函数的定义
    2. void Widget::keyPressEvent(QKeyEvent *event)
    3. {
    4. qDebug() << "键盘被按下了" << event->text()<<"键值为:" << event->key();
    5. switch(event->key())
    6. {
    7. case'W':
    8. {
    9. if(ui->label->y()<=0-ui->label->height())
    10. {
    11. ui->label->move(ui->label->x(),this->height());
    12. }
    13. ui->label->move(ui->label->x(),ui->label->y()-10);
    14. break;
    15. }
    16. case'S':
    17. {
    18. if(ui->label->y()>=this->height())
    19. {
    20. ui->label->move(ui->label->x(),0-ui->label->height());
    21. }
    22. ui->label->move(ui->label->x(),ui->label->y()+10);
    23. break;
    24. }
    25. case'A':
    26. {
    27. if(ui->label->x()<=0-ui->label->width())
    28. {
    29. ui->label->move(this->width(),ui->label->y());
    30. }
    31. ui->label->move(ui->label->x()-10,ui->label->y());
    32. break;
    33. }
    34. case'D':
    35. {
    36. if(ui->label->x()>=this->width())
    37. {
    38. ui->label->move(0-ui->label->width(),ui->label->y());
    39. }
    40. ui->label->move(ui->label->x()+10,ui->label->y());
    41. break;
    42. }
    43. }
    44. }

    Xmind:

  • 相关阅读:
    04_瑞萨GUI(LVGL)移植实战教程之驱动LCD屏(SPI)
    linux命令别名
    (☞゚ヮ゚)☞【精品C语言整理】☜(゚ヮ゚☜)女盆友缠着你让你教她写代码怎么办?安排,三万字博文带你走遍C语言,从此不再害怕编程
    ARM裸机二
    堆排序(大根堆与小根堆)
    Linux删除文件与Python代码删除文件命令
    HTML设计一个简单的奥迪RS汽车主题网站( web网页制作期末大作业)
    ZC-CLS381RGB颜色识别+8x8点阵指示(完)
    vue-前端实现模糊查询
    【LeetCode热题100】--56.合并区间
  • 原文地址:https://blog.csdn.net/yymbxqdm/article/details/132630210