只能在线观看的电影网站咋么做,中国建设官方网站企业,科技与生活,多备份 wordpress目录
概念
分类
多界面编程思路
新建界面
注意
头文件
无数据传输跳转界面
有数据传输跳转界面 对象公有接口
界面之间数据传输
信号与槽函数进行数据传输跳转界面
信号:
槽:
概念
格式1 关联信号和发送信号
格式2
通信步骤 自定义信号和槽函数
总结
实…目录
概念
分类
多界面编程思路
新建界面
注意
头文件
无数据传输跳转界面
有数据传输跳转界面 对象公有接口
界面之间数据传输
信号与槽函数进行数据传输跳转界面
信号:
槽:
概念
格式1 关联信号和发送信号
格式2
通信步骤 自定义信号和槽函数
总结
实例 制作一个教务管理系统
第一步新建一个Mainwindow类界面项目配置ui修改三个输入框的名字编辑
第二步设置Mainwindow类界面里的教师按钮的点击事件
第三步新建一个teacherwindow类界面配置ui界面和按钮点击事件并在teacherwindow类界面里定义槽函数和自定义信号
第四步新建一个setwindow类界面配置ui界面和按钮点击事件并在setwindow类界面里定义槽函数和自定义信号
第五步定义Mainwindow类界面要发送的自定义信号和编写按钮点击事件
自定义信号
教师按钮点击事件
第六步编写teacherwindow类界面和setwindow类界面里的槽函数和按钮点击事件
teacherwindow类界面
setwindow类界面 概念
实现多界面跳转
分类
无数据传输跳转有数据传输跳转
多界面编程思路
创建另一个界面的对象显示要跳转的界面关闭或者隐藏当前的界面
一个界面的本质上就是一个类的对象但是界面的显示和关闭完全由程序设计者维护并不是由系统维护所以界面对象的创建在堆空间上申请内存
新建界面
点击项目右键选择add new...左边选择Qt中间选择Qt设计师界面类点击下一步两个选一个第一个首界面是QWidget后面要跳转的界面都选QMainWindow 再点击下一步修改界面类名
注意
第一个设置的登录界面一定是 QWidget基类否则界面跳转传递父窗口 一定会闪退。比如父窗口是QMainWindow,子窗口是QWidget无法进行多界面跳转。而且建议第二个界面和后面的界面是QMainWindow基类
头文件
要包含新界面的头文件
无数据传输跳转界面
//跳转新界面不能回来原来界面
//先新建一个界面MWindow类
//跳转到另一个界面然后关闭当前界面
void Loginwidget::on_btn1_clicked()//按钮点击函数
{//第一步:创建另一个界面的对象// new Mainwindow 说明创建新界面对象跟当前界面没有关联不记录它是从哪个界面跳转而来 MainWindow *mainWidget new MainWindow;//关闭之后自动销毁对象mainwidget-setAttribute(Qt::WA DeleteOnClose);//第二步:显示要跳转的界面mainWidget-show();//第三步:关闭当前的界面,跳转到另一个界面之后就不能返回原来的界面了this-close();
}
//--------------------------------------
//跳转新界面能回来原来界面
//先新建一个界面MWindow类
//跳转到另一个界面然后关闭当前界面
void Loginwidget::on_btn2_clicked()//按钮点击函数
{//第一步:创建另一个界面的对象// new MainWindow(this)把父窗口传递过去记录从哪一个界面跳转//跳转的窗口可以设置按钮重新跳转回这个界面MainWindow *mainWidget new MainWindow(this);//关闭之后自动销毁对象mainwidget-setAttribute(Qt::WA DeleteOnClose);//第二步:显示要跳转的界面mainWidget-show();//第三步:隐藏当前的界面,跳转到另一个界面之后点击返回按钮还可以返回当前界面this-hide();
}//新界面的返回按钮
void Mainwindow::on_backbtn_clicked()
{//因为在跳转时记录了上一个界面//所以可以利用此函数获取当前窗口的父窗口对象指针Qwidget *parent this-parentWidget();qDebug()parent addr:parent;//把之前父界面的隐藏状态改为显示状态显示父界面parent-show();//关闭当前界面this-close();//销毁子界面//delete this; //如果设置了自动销毁则不需要手动delete
}
有数据传输跳转界面 对象公有接口
界面之间数据传输
原理就是不同界面本质上就是不同的类对象也就是说不同类对象之间的数据传输。在一个类中定义一个公有的接口在另一个类的接口函数中通过类对象调用公有接口传入对应的参数值
//新建一个界面MainWindow类
//跳转到新界面
void Loginwidget::on_btn1_clicked()
{//第一步:创建另一个界面的对象并把本身界面的地址传给新界面MainWindow *mainWindow new MainWindow(this);//关闭界面的时候自动释放内存mainWindow-setAttribute(Qt::WA DeleteOnClose)://传输数据 --调用公有函数成员实现数据传输mainWindow-setIP(ui-iplineEdit-text());//获取本界面的输入框的数据并传输mainWindow-setPort(ui-portlineEdit-text());//获取本界面的输入框的数据并传输//第二步:显示要跳转的界面mainWindow-show();//第三步:隐藏当前的界面this-hide();
}//新界面
//这个函数是在另一个类中被调用 用来传输数据
void Mainwindow::setIP(QString ip)
{ui-iplabel-setText(ip);//当前界面的输入框写入数据
}
//这个函数是在另一个类中被调用 用来传输数据
void Mainwindow::setPort(QString port)
{ui-portlabel-setText(port);//当前界面的输入框写入数据
}
//返回按钮
void Mainwindow::on_pushButton_clicked()
{//获取原先界面的地址Qwidget *parent this-parentwidget();//显示原先界面parent-show();//关闭当前界面this-close();
}
信号与槽函数进行数据传输跳转界面
信号:
本质上也是一个函数可以使用系统预定义的信号开发者也可以自定义信号如果自定义信号该信号只需要声明(类中)并不需要实现
槽:
本质上也是一个函数可以使用系统预定义的槽开发者也可以自定义槽如果自定义槽该槽需要声明(类中)并需要实现
概念
信号与槽函数机制是QT编程的基础也是QT的一大创新是通过QT的元对象系统实现。信号(Signal)就是在特定条件下被发射的事件。比如QPushButton 最常见的信号就是鼠标单击时发射clicked()信号。当信号被发射出去之后很多时候我们需要对这个信号进行响应处理对信号进行响应的函数称之为 槽函数槽函数跟一般的函数用法一样只不过槽函数可以跟信号进行关联。当信号被发射时槽函数将会自动执行。
信号-----------函数该函数不需要实现槽函数----------函数该函数需要实现实现自己的功能 格式1 关联信号和发送信号
QMetaObject::Connection QObject::connect
(const QObject *sender,//信号的发送者const char *signal,//发送什么信号const QObect *receiver,//接收者const char *method,//接收者的槽函数信号响应函数Qt::ConnectionType Qt::AutoConnection//连接的类型默认自动连接
)
Connection 函数是QObject类的一个静态函数不过QObject类是所有Qt类的基类在实际调用时可以忽略前面的限定符。
//当你在本界面新建一个按钮然后建立点击函数会自动关联点击信号
//也可以手动关联
connect
(ui-btn1,//信号发送者指针本界面的按钮发送的信号QPushButton::clicked,//按钮发送的信号点击信号已经定义好了this,//接收者对象指针自己接收Widget::on_btn1_clicked//接受者的槽函数点击事件函数
);void Widget::on_btn1_clicked()
{qDebug()1;//也可以自己发送自定义信号sendSignals是自定义信号//格式如下emit 信号;emit sendSignals(自定义数据);
}
格式2
格式
Connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
SIGNAL表示宏函数括号里是信号信号有参数就要加参数
SLOT表示槽函数括号里是槽函数槽函数有参数就要加参数//比如
Connect(this,SIGNAL(sendIPSignal(QString)),mainWindow,SLOT(on_getIP(QString)));
//sendIPSignal(QString)是自定义信号
//on_getIP(QString)是自定义槽函数
通信步骤 自定义信号和槽函数
第一步在LoginWidget类旧界面中自定义 或者 使用系统预定义好的信号谁发送信号就在哪定义
class LoginWidget:public QWidget
{Q_OBJECT//如果是自定义的类想要支持信号和槽的操作必须要加上宏//[2] 声明这个宏来说明要使用信号和槽
public:LoginWidget(QWidget *parent nullptr);~LoginWidget();private slots://代表下面是槽函数void on_btn1_clicked();signals://表示下面是自定义信号 不需要实现只用声明可以发送数据void sendIPSignal(QString ip);private:Ui::sendIPSignal(QString ip);
}
第二步在MainWindow类新界面中定义槽函数类内声明类外实现谁接收就在谁那定义槽函数
class MainWindow : public QMainWindow
{Q_OBJECT//如果是自定义的类想要支持信号和槽的操作必须要加上宏//[2] 声明这个宏来说明要使用信号和槽private slots://表示下面是槽函数void on_getIP(QString ip);//类内声明类外定义
}//类外实现
void on_getIP(QString ip)
{qDebug()ip;
}
第三步在LoginWidget类旧界面中关联信号
connect(this,LoginWidget::sendIPSignal,widget,MainWindow::on_getIP);
//this表示是自己发送信号
//LoginWidget::sendIPSignal表示发送的是什么信号LoginWidget是旧界面
//widget是MainWindow *widget定义的对象就是新界面的对象
//MainWindow::on_getIP表示槽函数定义在新界面里
第四步在LoginWidget类旧界面中发送自定义信号
//发送名为sendIPSignal的信号信号有参数
emit sendIPSignal(想要传的数据);
总结
信号和槽中槽函数的调用是通过信号来完成所以槽函数的参数类型要跟信号函数的参数类型保持一致槽的参数个数不大于信号的参数个数槽函数的调用必须要跟对应的信号建立连接关系通过connect函数来实现连接个信号可以跟多个槽函数相关联多个信号可以执行同一个槽函数个信号可以跟另一个信号相关联使用信号与槽函数机制必须在类的声明中添加Q OBJECT宏因为只有标记该宏的头文件才能让元对象编译器去处理。
实例 制作一个教务管理系统
教务管理系统需求描述: 教务管理系统用户可以选择教师或者学生角色进行系统当教师登录时可以将教师信息传输到教师界面显示同时程序还可以对教师信息可进行修改设置并保存将保存的信息显示在教师界面。
第一步新建一个Mainwindow类界面项目配置ui修改三个输入框的名字 第二步设置Mainwindow类界面里的教师按钮的点击事件
第三步新建一个teacherwindow类界面配置ui界面和按钮点击事件并在teacherwindow类界面里定义槽函数和自定义信号 //槽函数
public slots:void onRecvDataSlot(QString name,QString classes,QString works);
//自定义信号
signals:void sendDataSignal(QString name,QString classes,QString works);第四步新建一个setwindow类界面配置ui界面和按钮点击事件并在setwindow类界面里定义槽函数和自定义信号 //槽函数
public slots:void onRecvDataSlot(QString name,QString classes,QString works);
//自定义信号
signals:void sendDataSignal(QString name,QString classes,QString works);第五步定义Mainwindow类界面要发送的自定义信号和编写按钮点击事件
自定义信号
signals:void sendDataSignal(QString name,QString classes,QString works);教师按钮点击事件
#include QMessageBox//弹窗头文件
#include teacherwindow.h//教师界面头文件
//教师按钮信号
void MainWindow::on_btn_teacher_clicked()
{//1、获取当前界面上输入框的数据QString name ui-lineEdit_name-text();QString classes ui-lineEdit_classes-text();QString works ui-lineEdit_work-text();//2、判断数据是否为空空就弹窗if(name.isEmpty() || classes.isEmpty() || works.isEmpty()){//加入头文件//设置弹窗QMessageBox::warning(this,消息,不能为空);return;}//3、创建教师界面对象,并设置退出自动释放teacherWindow *teawidget new teacherWindow(this);teawidget-setAttribute(Qt::WA_DeleteOnClose);//信号在当前界面定义槽函数在教室界面定义//4.1、在教师界面定义槽函数进行关联//this本界面发送//MainWindow::sendDataSignal当前界面定义的信号//teawidget接收的界面//teacherWindow::onRecvDataSlot接收界面的槽函数connect(this,MainWindow::sendDataSignal,teawidget,teacherWindow::onRecvDataSlot);//4.2、发送当前界面的数据传输到教师界面发送sendDataSignal自定义信号在当前界面定义emit sendDataSignal(name,classes,works);//5、显示另一个界面teawidget-show();//6、隐藏当前界面this-hide();
}
第六步编写teacherwindow类界面和setwindow类界面里的槽函数和按钮点击事件
teacherwindow类界面
//头文件
#include QMessageBox//弹窗头文件
#include setwindow.h//设置界面头文件//槽函数
void teacherWindow::onRecvDataSlot(QString name, QString classes, QString works)
{//将数据显示到输入框里ui-lineEdit_name-setText(name);ui-lineEdit_classes-setText(classes);ui-lineEdit_work-setText(works);
}//按钮点击事件
void teacherWindow::on_SetButton_clicked()
{//1、获取当前界面上的数据QString name ui-lineEdit_name-text();QString classes ui-lineEdit_classes-text();QString works ui-lineEdit_work-text();//2、判断数据是否为空空就弹窗if(name.isEmpty() || classes.isEmpty() || works.isEmpty()){//加入头文件#include QMessageBox//弹窗头文件//设置弹窗QMessageBox::warning(this,消息,不能为空);return;}//3、创建设置界面对象,并设置退出自动释放setWindow *setwidget new setWindow(this);setwidget-setAttribute(Qt::WA_DeleteOnClose);//4.1、在设置界面定义槽函数进行关联connect(this,//当前界面发送的数据SIGNAL(sendDataSignal(QString,QString,QString)),//用宏来表示发送什么信号setwidget,//接收的界面SLOT(onRecvDataSlot(QString,QString,QString))//接收界面的槽函数);//4.2、发送当前界面的数据传输到设置界面发送sendDataSignal自定义信号在当前界面定义emit sendDataSignal(name,classes,works);//5、显示另一个界面setwidget-show();//6、隐藏当前界面this-hide();
}
setwindow类界面
//槽函数
void setWindow::onRecvDataSlot(QString name, QString classes, QString works)
{ui-lineEdit_name-setText(name);ui-lineEdit_classes-setText(classes);ui-lineEdit_work-setText(works);
}//按钮点击事件返回上一级或者上上一级的界面
void setWindow::on_SuccessButton_clicked()
{//返回教师界面//获取教师界面对象QWidget *widget this-parentWidget();//获取当前界面上的数据QString name ui-lineEdit_name-text();QString classes ui-lineEdit_classes-text();QString works ui-lineEdit_work-text();//关联 在上一个界面关联返回的信号写在上一个界面的点击按钮事件里//connect(setwidget,setWindow::sendDataSignal,this,teacherWindow::onRecvDataSlot); //发送信号emit sendDataSignal(name,classes,works);widget-show();this-close();//返回第一个界面//获取第一个界面对象
// QWidget *widget1 this-parentWidget()-parentWidget();
// widget1-show();
// this-close();
}