QT浅尝,第一次接触

一、架构

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;
    }

};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值