• qt 信号与槽机制,登录界面跳转


    登录界面跳转

    配置文件 .pro

    1. QT += core gui texttospeech
    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. form.cpp \
    15. main.cpp \
    16. widget.cpp
    17. HEADERS += \
    18. form.h \
    19. widget.h
    20. FORMS += \
    21. form.ui \
    22. widget.ui
    23. # Default rules for deployment.
    24. qnx: target.path = /tmp/$${TARGET}/bin
    25. else: unix:!android: target.path = /opt/$${TARGET}/bin
    26. !isEmpty(target.path): INSTALLS += target
    27. RESOURCES += \
    28. icon.qrc

    头文件.head

    1. #ifndef FORM_H
    2. #define FORM_H
    3. #include //父类所在的头文件
    4. #include //标签类所在的头文件
    5. namespace Ui {
    6. class Form;
    7. }
    8. class Form : public QWidget //封装一个类,公共继承与QWidget
    9. {
    10. Q_OBJECT //信号和槽的元对象
    11. public:
    12. explicit Form(QWidget *parent = nullptr); //构造函数的声明, 默认参数nullptr
    13. ~Form(); //析构函数的声明
    14. private:
    15. Ui::Form *ui; //通过ui指针可以找到通过图形化界面拖拽的组件,ui->组件名
    16. //定义一个标签指针
    17. QLabel *lab1;
    18. };
    19. #endif // FORM_H
    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include >
    10. QT_BEGIN_NAMESPACE
    11. namespace Ui { class Widget; }
    12. QT_END_NAMESPACE
    13. class Widget : public QWidget
    14. {
    15. Q_OBJECT
    16. public:
    17. Widget(QWidget *parent = nullptr);
    18. ~Widget();
    19. signals:
    20. void my_signal(); //定义一个信号函数
    21. void jump(); //声明一个跳转的信号函数
    22. public slots:
    23. void my_login_slot(); //声明一个处理登录按钮发射的信号的槽函数
    24. void my_cancle_slot(); //声明一个处理取消按钮发射的信号的槽函数
    25. private:
    26. Ui::Widget *ui;
    27. //定义一个标签指针
    28. QLabel *lab1;
    29. QLabel *lab2;
    30. QLabel *lab3;
    31. //定义行编辑器指针
    32. QLineEdit *Edit1;
    33. QLineEdit *Edit2;
    34. //定义btn按钮指针
    35. QPushButton *btn1;
    36. QPushButton *btn2;
    37. //定义一个播报员指针
    38. QTextToSpeech *speecher;
    39. };
    40. #endif // WIDGET_H

    源文件.sources

    1. #include "form.h"
    2. #include "ui_form.h"
    3. Form::Form(QWidget *parent) : //定义构造函数的实现
    4. QWidget(parent),
    5. ui(new Ui::Form) //实例化ui指针的空间
    6. {
    7. ui->setupUi(this); //实例化通过图形化界面拖拽处理的组件的空间,让其依附此界面而存在
    8. //固定页面大小
    9. this->setFixedSize(400,400);
    10. //给lab1实例化空间
    11. lab1 = new QLabel("我爱学习", this);
    12. //设置大小
    13. lab1->resize(80,40);
    14. //移动位置
    15. lab1->move(160,180);
    16. }
    17. //析构函数的实现
    18. Form::~Form()
    19. {
    20. delete ui; //释放指针成员ui的空间
    21. }
    1. #include "widget.h" //自定义类Weidget所在的头文件widget
    2. #include "form.h" //自定义类Form所的头文件form
    3. #include //应用程序类所在的头文件
    4. int main(int argc, char *argv[])
    5. {
    6. QApplication a(argc, argv); //实例化一个应用程序的类对象a,调用有参构造函数
    7. Widget w; //实例化一个Widget的类对象w,调用无参构造函数
    8. w.show(); //调用show函数,展示图形化界面
    9. Form f; //实例化一个类对象f,调用无参构造函数
    10. //将w中发射的jump信号连接到f的show函数中
    11. QObject::connect(&w, &Widget::jump, &f, &Form::show); //因为connect函数是由QObject类提供的,main函数中没有这个类,所以需要手动指定
    12. return a.exec();
    13. }
    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. speecher = new QTextToSpeech();
    9. //固定窗口大小
    10. this->setFixedSize(600, 560);
    11. //设置窗口标题
    12. this->setWindowTitle("hello");
    13. //设置窗口图标
    14. this->setWindowIcon(QIcon("C:/Users/asus/Desktop/icon/wodepeizhenshi.png"));
    15. //实例化空间,指定父组件,依附于此界面存在
    16. lab1 = new QLabel(this);
    17. //设置大小
    18. lab1->resize(600, 250);
    19. //设置图片
    20. lab1->setPixmap(QPixmap(":/new/prefix1/icon/logo.png"));
    21. //设置图片自适应
    22. lab1->setScaledContents(true);
    23. //为lab2实例化空间,指定父组件
    24. lab2 = new QLabel(this);
    25. //设置大小
    26. lab2->resize(30, 30);
    27. //设置图片
    28. lab2->setPixmap(QPixmap(":/new/prefix1/icon/userName.jpg"));
    29. //设置图片自适应
    30. lab2->setScaledContents(true);
    31. //移动位置
    32. lab2->move(140, 320);
    33. //为lab3实例化空间
    34. lab3 = new QLabel();
    35. //设置指定父组件,依附此界面存在
    36. lab3->setParent(this);
    37. //设置大小
    38. lab3->resize(30, 30);
    39. //设置图片
    40. lab3->setPixmap(QPixmap(":/new/prefix1/icon/passwd.jpg"));
    41. //设置图片自适应
    42. lab3->setScaledContents(true);
    43. //移动位置
    44. lab3->move(lab2->x(), lab2->y()+80);
    45. //无参构造一个行编辑器 QLineEdit
    46. Edit1 = new QLineEdit();
    47. //指定父组件,让其依附于此界面存在
    48. Edit1->setParent(this);
    49. //设置大小
    50. Edit1->resize(240, 40);
    51. //设置背景色
    52. Edit1->setStyleSheet("background-color:white; border: 1px solid gray; padding: 10px;");
    53. //移动位置
    54. Edit1->move(lab2->x()+80, lab2->y()-10);
    55. //设置占位文本
    56. Edit1->setPlaceholderText("QQ/手机/邮箱");
    57. //有参构造一个行编辑器 QLineEdit
    58. Edit2 = new QLineEdit(this);
    59. Edit2->resize(Edit1->size());
    60. //设置北京四
    61. Edit2->setStyleSheet("background-color:white; border: 1px solid gray; padding: 10px;");
    62. //移动位置
    63. Edit2->move(lab3->x()+80, lab3->y()-10);
    64. //设置文本位置
    65. Edit2->setPlaceholderText("密码");
    66. //设置回显模式
    67. Edit2->setEchoMode(QLineEdit::Password);
    68. //有参构造一个命令按钮,初始化文本内容,指定父组件 QPushButton
    69. QPushButton *btn1 = new QPushButton("登录", this);
    70. //设置大小
    71. btn1->resize(80, 40);
    72. //移动位置
    73. btn1->move(240, Edit2->y()+80);
    74. //设置图片
    75. btn1->setIcon(QIcon(":/new/prefix1/icon/login.png"));
    76. //有参构造一个命令按钮,初始化图标和文本内容,指定父组件QPushButton
    77. QPushButton *btn2 = new QPushButton(QIcon(":/new/prefix1/icon/cancel.png"), "取消", this);
    78. //设置大小
    79. btn2->resize(btn1->size());
    80. //移动位置
    81. btn2->move(btn1->x()+120, btn1->y());
    82. Edit1->clear();
    83. //qt5实现连接
    84. connect(btn1, &QPushButton::clicked, this, &Widget::my_login_slot);
    85. //参数1:信号发送者
    86. //参数2:要发送的信号,发送的信号函数的函数指针变量(函数名),指定是哪个类的, 该信号函数必须是该组件所在类中所具有的信号函数
    87. //参数3:信号的接收者
    88. //参数4:槽函数, 槽函数的函数指针,指定是哪个类的,该槽函数必须是该组件所在类中具有的槽函数
    89. //qt4实现连接
    90. // connect(btn2, SIGNAL(clicked()), this, SLOT(my_cancle_slot()));
    91. //参数1: 信号的发送者
    92. //参数2: 要发送的信号, 该信号函数必须是该组件中所在类中所具有的信号函数,需要使用SIGNAL宏来转换
    93. //参数3: 信号的接收者
    94. //参数4: 槽函数,该槽函数必须是该组件所在类中具有的槽函数,需要使用SLOT宏来转换
    95. connect(btn2, SIGNAL(clicked()), this, SLOT(close()));
    96. }
    97. Widget::~Widget()
    98. {
    99. delete ui;
    100. }
    101. //自定义槽函数的实现
    102. void Widget::my_login_slot()
    103. {
    104. //获取ui界面上的用户名和密码
    105. //Qstring username = Edit1->text();
    106. //Qstring passwd = Edit2->text();
    107. if(Edit1->text() == "admin" && Edit2->text() == "123456")
    108. {
    109. emit jump();
    110. qDebug() << "登录成功";
    111. speecher->say("登录成功");
    112. this->close();
    113. }
    114. else
    115. {
    116. qDebug() << "登录失败";
    117. speecher->say("登录失败");
    118. Edit2->clear();
    119. }
    120. }
    121. void Widget::my_cancle_slot()
    122. {
    123. this->close();
    124. }

    1、多态、虚函数、纯虚函数
    答:多态分为静态多态和动态多态,静态多态有函数重载、运算符重载,函数重载表示在同一作用域下,相同函数名,不同参数列表实现不同的功能,运算符重载表示为对运算符的重新构建从而实现更多复杂的功能。动态多态表示为父类的指针或引用,指向或初始化子类的对象,调用子类对父类重写的函数,进而展开子类的功能。

            首先动态多态的运行存在许多前提条件,第一点是必须有继承关系,因为动态多态发生在父子类之间。第二点是子类和父类有他们同名同类型的函数,只有子类中有与父类同名同类型的函数时才能实现对函数的重写,第三点是父类被重写的函数必须为虚函数。

            虚函数,用virtual修饰的函数即为虚函数,当类中存在虚函数,那么该类中就会有一个虚指针,虚指针指向虚函数表,虚函数表中记录了所有虚函数以及子类对父类重写的函数。

            当父类中的虚函数没有实际意义时,可将该虚函数设置为纯虚函数,含有纯虚函数的类被称为抽象类,抽象类不能实例化对象,当子类没有对父类的纯虚函数进行重新时,子类也被称为抽象类。

    2、将“引用”作为函数参数有哪些特点?
    答:函数参数是程序间数据交互的桥梁,一般分为值传递和地址传递。值传递,传递的是值,不改变值原本的大小。地址传递,传递的是地址,当通过地址访问到其地址所指向的内容时,其内容可以发生改变。引用的实质为取别名,一旦确定指向不能更改。使用引用作为函数参数时,不需要重新开辟空间,效率高,通过引用可直接改变其对应的内容。当引用不想被改变的变量时,可使用const修饰,此时为常引用,常引用不能修改值的大小。

    3、结构体和联合体有何区别?
    答:结构体与联合体都是构造数据类型,都是由相同或不同的数据类型构造而成。但是结构体每个成员地址连续,结构体大小由每个成员的字节大小字节对齐原则决定。而联合体大小由其成员中字节最大的决定,所有成员共用一片空间。
     

  • 相关阅读:
    React给方法使用useState
    数据结构——顺序表
    自定义数据类型:结构体、枚举、联合
    Java多线程(6):锁与AQS(中)
    什么是三层工业交换机?
    vite配置.env环境变量文件,开发环境,测试环境,预发布环境,生产环境
    基于轻量级CNN的12306验证码识别分析系统
    sudo 权限之危险的 bash 命令
    第一个微信小程序的初始化过程、小程序微信开发平台的下载、如何注册一个微信小程序的账号
    基于nodejs+vue教学辅助管理系统
  • 原文地址:https://blog.csdn.net/qq_46766479/article/details/132612553