class Widget : public QWidget
{
Q_OBJECT //信号与槽的元对象
signals:
void my_signal(); //自定义信号函数
public slots:
void my_slot(); //自定义的槽函数
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
[static] QMetaObject::Connection //返回值是一个连接,并且该函数是一个静态成员函数
QObject::connect( //函数名
const QObject *sender, //信号的发射者,是组件的指针
const char *signal, //要发射的信号是一个C语言风格的字符串,将信号函数传递进来时,需要使用SIGNAL宏进行转换
const QObject *receiver, //信号的接受者,是组件的指针
onst char *method) //处理信号的槽函数,是C风格字符串,将槽函数传递进来时,需要使用SLOT宏进行转换
注意:信号函数必须是信号的发射者所在的类中有的信号函数,而槽函数也必须是信号的接受者中有的槽函数
举个例子:
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int)));
[static] QMetaObject::Connection //返回值是一个连接,并且该函数是一个静态成员函数
QObject::connect( //函数名
const QObject *sender, //信号的发射者,是组件的指针
PointerToMemberFunction signal, //信号函数的函数指针变量,直接填写函数名即可
const QObject *receiver, //信号的接受者,是组件的指针
PointerToMemberFunction method) //槽函数的函数指针变量,直接填写函数名即可
举个例子:
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);
[static] QMetaObject::Connection //返回值是一个连接,并且该函数是一个静态成员函数
QObject::connect( //函数名
const QObject *sender, //信号的发射者,是组件的指针
PointerToMemberFunction signal, //信号函数的函数指针变量,直接填写函数名即可
Functor functor) //处理信号的功能函数,可以是全局函数,也可以是lambda表达式
举个例子:
void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);
Lambda 表达式作为槽函数:
QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
socket->write("GET " + page + "\r\n");
});
只需将上面的连接函数前加dis即可,参数都不变
信号函数与槽函数参数个数总结
1、信号函数和槽函数进行链接时,一般要求信号函数和槽函数的参数保持一致
connect(信号发送者, SIGNAL(signalFun()),信号接收者, SLOT(slotFun())); //Ok
connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int))); //Ok
connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int, char))); //Ok
connect(信号发送者, SIGNAL(signalFun(char, int)),信号接收者, SLOT(slotFun(int, char))); //False
connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(char))); //False
2、当信号函数的参数大于槽函数的参数时
connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun())); //Ok
connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int))); //Ok
connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(char))); //False
3、当信号函数的参数小于槽函数的参数时
connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int, char))); //False
connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int, char=0))); //Ok
完成登录框的按钮操作,并在登录成功后进行界面跳转
.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
signals:
void my_signal();
void jump();
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void my_slot();
void on_clicked();
private:
Ui::MainWindow *ui;
QPushButton *btn1;
QPushButton *btn2;
QLabel *lab1;
QLineEdit * edit1;
QLineEdit * edit2;
};
#endif // MAINWINDOW_H
/*********************************************************************/
//第二个界面
#ifndef FORM_H
#define FORM_H
#include
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
~Form();
public slots:
void jump_slot();
private:
Ui::Form *ui;
};
#endif // FORM_H
.cpp文件
#include "mainwindow.h"
#include
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//设置窗口
this->resize(540,410); //设置窗口大小
this->setWindowTitle("奕书聊天室");//设置窗口标题
this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));
//设置登录按钮组件
btn1 = new QPushButton(QIcon(":/login.png"),
"登录",
this);//设置按钮组件的图标,文本内容,和让其在当前界面显示
btn1->move(240,340); //设置按钮组件的位置
btn1->resize(80,40); //设置按钮组件的大小
// btn1->setEnabled(false); //设置按钮不可点击
//连接登录按钮
connect(btn1,&QPushButton::clicked, this, &MainWindow::my_slot);
connect(btn1,&QPushButton::clicked, this, &MainWindow::on_clicked);
//设置取消按钮组件
btn2 = new QPushButton(QIcon(":/cancel.png"),
"取消",
this);//设置按钮组件的图标,文本内容,和让其在当前界面显示
btn2->move(340,340);
btn2->resize(80,40);
// btn2->setEnabled(false);
//连接取消登录按钮
connect(btn2,SIGNAL(pressed()),this,SLOT(close()));
//设置LOGO
lab1 = new QLabel(this);
lab1->setPixmap(QPixmap(":/logo.png"));
lab1->resize(540,180);
lab1->setScaledContents(true);
//设置行编辑器 账号
edit1 = new QLineEdit(this);
edit1->resize(220,40);
edit1->move(180,220);
edit1->setPlaceholderText("QQ号码/手机/邮箱");//设置占位符
//edit1->setEchoMode(QLineEdit::Password);
//设置行编辑器 密码
edit2 = new QLineEdit(this);
edit2->resize(220,40);
edit2->move(180,280);
edit2->setPlaceholderText("密码");//设置占位符
edit2->setEchoMode(QLineEdit::Password);//设置密文显示
//设置账号的LOGO
QLabel *lab2 = new QLabel(this);
lab2->setPixmap(QPixmap(":/userName.jpg"));
lab2->resize(50,40);
lab2->move(edit1->x()-85,edit1->y());
lab2->setScaledContents(true); //设置图片内容自适应
//设置账号的LOGO
QLabel *lab3 = new QLabel(this);
lab3->setPixmap(QPixmap(":/passwd.jpg"));
lab3->resize(50,40);
lab3->move(edit2->x()-85,edit2->y());
lab3->setScaledContents(true); //设置图片内容自适应
}
MainWindow::~MainWindow()
{
}
void MainWindow::my_slot()
{
if(edit1->text()=="admin" && edit2->text()=="123456")
{
qDebug()<<"登录成功";
this->close();
}
else
{
qDebug()<<"登录失败";
edit2->clear();
}
}
void MainWindow::on_clicked()
{
emit jump();
}
/********************************************************************/
//第二个界面
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
}
Form::~Form()
{
delete ui;
}
void Form::jump_slot()
{
this->show();
}
类的三大属性:多态,封装,继承;多态也就是一种形式的多种状态,多态又分为静态多态和动态多态,函数重载时就属于静态多态,而运行时属于动态多态;多态又是父类的指针或者引用指向或初始化子类对象,调用子类对父类重写的函数,进而展开子类的功能
虚函数用virtual修饰的函数即为虚函数,当类中存在虚函数,那么该类中就会有一个虚指针,虚指针指向虚函数表,虚函数表中记录了所有虚函数以及子类对父类重写的函数。
纯虚函数:当父类中的虚函数没有实际意义时,可将该虚函数设置为纯虚函数,含有纯虚函数的类被称为抽象类,抽象类不能实例化对象,当子类没有对父类的纯虚函数进行重新时,子类也被称为抽象类。