事件
自定义事件处理
自己写的类继承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();