一、架构
QT项目架构分为四类文件
1、*.h文件
相当于Java中的接口文件,其中class相当于类,private相当于私有方法,public相当于公共方法,signals是QT中的“信号”,public slots是QT中的“槽”
2、*.cpp文件
相当于Java中的实现类,主要实现h文件中定义的方法
3、*.ui文件
是界面文件,向用户展示的UI文件再这里面编写
4、*.*文件
是配置文件,项目中用到的图片或者其它ini文件
二、简单例子
# 先创建一个a.h文件
# 引入用到的组件
#include <QNetworkReply>
class a : public QObject
{
Q_OBJECT
public:
a(QObject* parent = NULL);
~a();
void helloword();
string hi();
void biu(QString parent);
public slots:
void check_string();
private:
int time;
}
# h文件就算创建完了
# 再创建一个a.cpp文件
#引入用到的组件
#include <QTimerEvent>
#定义一个定时器
#define TIMER_TIMEOUT (5*1000)
a::a(QObject *parent)
:QObject(parent)
{
time= this->startTimer(TIMER_TIMEOUT);
}
a::~a()
{
}
void a::a(QTimerEvent *event)
{
if(event->timerId() == time){
// handleTimeout();
helloword();
}
}
void a::handleTimeout()
{
qDebug()<<"enter timeout processing function\n";
killTimer(time);
}
void a::helloword()
{
qDebug()<<"helloword\n";
}
void a::hi()
{
qDebug()<<"hi\n";
return "zhangsan";
}
void a::biu(QString parent)
{
qDebug()<<parent;
}
三、QT中插槽
个人理解:A插件触发了A事件(信号),由B插件的B方法处理,这里的A事件可以是QT自带的也是可以自己定义的(上面的signals);B插件就相当于上面定义的class,B方法是上面的public slots
插槽要求:
A信号带参数,B方法接收的参数类型和数量一定要和A相同,B参数的个数可以小于A参数
比如A窗口关闭,触发关闭信号,携带参数(int a,int b,int c)那B接收时参数不能多余3个,可以是2个1个或者无参,并且参数类型必须和A一致
# 插槽-带参数
connect(A,SIGNAL(&A::method(int,int)),B,SLOT(&B::test123(int,int)));
# 插槽-不带参数
connect(A,&A::method2),B,&B::test233);
# 插槽
connect(插件,触发信号,接收类,处理方法);
四、网页中window.open()的销毁
1、用qt写一个demo加载网页
2、网页中有一个按钮,按钮点击后调用js方法,用window.open()打开一个新窗口
3、新窗口会和服务器进行通信
4、关闭新窗口(问题:新窗口和服务器通信期间,关闭窗口,虽然窗口关闭了,但后台还在继续允许,并没有彻底关闭)
解决历程
1、监控窗口关闭信号来彻底关闭(失败)
2、setAttribute(Qt::WA_DeleteOnClose);//交由QT在关闭时自动析构,不用自己处理
# h文件代码
class Test : public QMainWindow{
Q_OBJECT
public:
void closeEvent(QCloseEvent *event);
signals:
// void closeEvent(QCloseEvent *event);
public slots:
void test456();
};
class MyWebView : public QWebEngineView{
Q_OBJECT
public:
Test* t1;
// 调用window.open()时,createWindow会自动响应
QWebEngineView *createWindow(QWebEnginePage::WebWindowType type) {
qDebug()<<"createWindow:"<<type;
MyWebView *pNewView = new MyWebView();
t1 = new Test();
t1 ->setCentralWidget(pNewView);
t1 ->setMinimumHeight(240);
t1 ->resize(1024, 768);
t1 ->show();
// 最终解决方法,加这一行,关闭时由QT自动析构,不用自己处理。5555
t1->setAttribute(Qt::WA_DeleteOnClose);
// connect(t1,&Test::closeEvent,t1,&Test::test456);
return pNewView;
}
};