QT 笔记

文章介绍了在Qt框架中如何进行自定义事件处理,包括重写父类事件函数和过滤特定事件。同时,提到了定时器的使用,通过连接timeout信号到槽函数来实现周期性任务。此外,文章还讨论了Qt中的Lambda表达式以及如何实现多线程,强调了主线程与子线程中操作窗口对象的规则。
摘要由CSDN通过智能技术生成

事件

自定义事件处理

自己写的类继承QT标准类,然后重写父类事件处理函数,Qt框架会自动进行事件分发,然后调用自定义的事件处理函数。

事件分发

事件分发就是根据事件的类型,自动调用事件处理函数,比如这是默认的事件分发器:

bool QWidget::event(QEvent *ev)
{
    switch(ev->type())
    {
    // 鼠标移动
    case QEvent::MouseMove:		
        mouseMoveEvent((QMouseEvent*)event);
        break;
    // 鼠标按下
    case QEvent::MouseButtonPress:	
        mousePressEvent((QMouseEvent*)event);
        break;
    // 鼠标释放
    case QEvent::MouseButtonRelease:	
        mouseReleaseEvent((QMouseEvent*)event);
        break;
    // 鼠标双击
    case QEvent::MouseButtonDblClick:	
        mouseDoubleClickEvent((QMouseEvent*)event);
        break;
    // 键盘按键被按下事件
    case QEvent::KeyPress:
        break;
        ...
        ...
        ...
    default:
        break;
    }
}

在事件分发器中过滤某些事件

一般也是用于自定义的类,重写事件分发函数
比如窗口中过滤掉鼠标按下的事件:重写继承自父类的event(),然后类似下面的代码,返回true表示时间已经被识别处理。

bool MainWindow::event(QEvent *ev)
{
    if(ev->type() == QEvent::MouseButtonPress ||
            ev->type() == QEvent::MouseButtonDblClick)
    {
        // 过滤调用鼠标按下的事件
        return true;
    }
    return QWidget::event(ev);
}

Timer

设置完时间间隔后,start,然后timer对象就会每个时间间隔发送一个timeout型号,将这个信号connet到一个槽函数就可以实现周期性执行

connect(timer, &QTimer::timeout, this, [=]()
{
    QTime tm = QTime::currentTime();
    // 格式化当前得到的系统时间
    QString tmstr = tm.toString("hh:mm:ss.zzz");
    // 设置要显示的时间
    ui->curTime->setText(tmstr);
});



Lambda 表达式 和匿名函数

Lambda 表达式就是一个匿名函数, 语法格式如下:
注意Qt5.4之前的版本使用lambda需要.pro中加一条:

CONFIG   += C++11
[capture](params) opt -> ret {body;};
    - capture: 捕获列表
    - params: 参数列表
    - opt: 函数选项
    - ret: 返回值类型
    - body: 函数体


Qt多线程

如果想让创建的子线程执行某个任务,需要写一个子类让其继承 QThread,并且在子类中重写父类的 run() 方法

这个run()函数是一个受保护的成员函数,不能够在类的外部调用,如果想要让线程执行这个函数中的业务流程,需要通过当前线程对象调用槽函数 start() 启动子线程,当子线程被启动,这个 run() 函数也就在线程内部被调用了。

在 Qt 中在子线程中不要操作程序中的窗口类型对象,不允许,如果操作了程序就挂了

只有主线程才能操作程序中的窗口对象,默认的线程就是主线程,自己创建的就是子线程

Qt各种类型转换

int 转Qstring

QString s = QString::number(i);

Qstring 转int

Qstring str;
str.toInt();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wow_awsl_qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值