• 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:

  • 相关阅读:
    揭秘小程序上线不到一周,每天2万销售额,究竟怎么做到的?
    AI作画:十分钟快速搭建自己的text-to-image diffusion models
    算法(圆的定义和相关术语)
    SpringCloudAlibaba货币交易系统实战 云盘
    asp.net学校门户网站系统VS开发sqlserver数据库web结构c#编程计算机网页项目
    拉新、复购、供应链,双11中小商家“三难”如何破?
    第二届邯郸钢铁展会,图扑软件荣获“2022钢铁行业智造之星奖”
    【共享单车数据专题】共享单车数据分析的技术要点
    VUE3照本宣科——应用实例API与setup
    【密评】商用密码应用安全性评估从业人员考核题库(十)
  • 原文地址:https://blog.csdn.net/yymbxqdm/article/details/132630210