C++(9) QT基础
QT 详解
1.信号和槽
conncet(信号发送者,信号,信号接收者,槽)
///connect(btn,&QPushButton::clicked,this,&Widget::close);
2.自定义信号和槽
场景:下课了,老师说他饿了,学生就请吃饭 信号发送者:老师 信号:老师饿了 信号接收者:学生 槽:请吃饭 创多少个类:Teacher Student 信号: hungry 1个 Teacher 槽:treat 1个 Student
pTeacher=new Teacher(this);//信号
pStudent = new Student(this);//槽函数
connect(pTeacher,&Teacher::hungry,pStudent,&Student::treat);
this->classxk();
void Widget::classxk()
{
emit pTeacher->hungry();
}
// 自定义信号
// 1 函数声明在类头文件的signals 域下面
// 2 void 类型的函数,没有返回值
// 3 可以有参数,也可以重载
// 4 只有声明,没有实现定义
// 5 触发信号 emit obj->sign(参数...)
3.信号和槽扩展
1 一个信号可以连接多个槽
一个信号建立了多个connect 那么当信号发射的时候,槽函数的调用顺序:随机
2 一个槽可以连接多个信号
3 信号可以连接信号
connect(第一个信号发送者,第一个信号,第二个信号发送者,第二个信号)
QPushButton *btn = new QPushButton("按钮1",this);
connect(btn,&QPushButton::clicked,pTeacher,
static_cast<void (Teacher::*)()>(&Teacher::hungry));
4 信号可以断开连接,disconnect
connect 参数怎么填,disconnect就怎么填
connect(pTeacher,teacher_qString,pStudent,student_qString);
//信号可以断开连接
disconnect(pTeacher,teacher_qString,pStudent,student_qString);
5 信号和槽的参数关系,必须同时满足以下两点
1 信号和槽函数的参数类型必须对应 2 信号和槽函数的参数个数不需要一致,信号函数参数个数>=槽函数参数个数 hungry(QString) -> treat() ok hungry(QString) -> treat(int) 编译出错 hungry(QString,int) -> treat(int) 编译出错
3.lambda表达式
[capture] (parameters) opt ->retType
{
……;
}
//调用lamdba的方式,使用函数指针
void (*p)()=
[]()
{
qDebug()<<"hello lambda";
};
p();
[capture] 捕获外部局部变量的列表,值传递,直接填变量名 ,引用传递就使用&变量名
使用= 值传递捕获所有局部变量
使用& 应用传递捕获所有局部变量
connect(btn,&QPushButton::clicked,[=](){
qDebug()<<a<<b;
});
4.对话框
1.非模态对话框释放
/创建一个非模态对话框
QDialog *dlg = new QDialog(this);
dlg->setAttribute(Qt::WA_DeleteOnClose);
dlg->show();
//因为show是非阻塞的函数,所以dlg会很快释放,改用new
//释放问题,只有父对象释放的时候子对象才释放
//通过设置窗口的属性,让他关闭的时候自动释放
2.获取Qmessagebox点击对于按钮
if(QMessageBox::Ok==
QMessageBox::question(this,"问你个事","你有对象吗?",
QMessageBox::Ok|QMessageBox::Cancel))
{
qDebug()<<"点击了Ok";
}
5.事件
单个具体的事件处理
void mouseMoveEvent(QMouseEvent *event);//鼠标移动
void mousePressEvent(QMouseEvent *event);//鼠标按下
void mouseReleaseEvent(QMouseEvent *event);//鼠标松开
总事件重写
bool event(QEvent *event);
bool Widget::event(QEvent *e)
{
if (e->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
if (keyEvent->key() == Qt::Key_Tab) {
qDebug() << "You press tab.";
return true;
}
}
return QWidget::event(e);
}
QT 5 event 代码
switch (event->type()) {
case QEvent::MouseMove:
mouseMoveEvent((QMouseEvent*)event);
break;
// ...
}
1.1 事件过滤器
virtual bool QObject::***eventFilter\*** ( QObject * watched, QEvent * event );
绘图事件
绘图事件:窗口需要重新显示的时候,就会收到一个绘图事件 paintEvent 收到绘图事件之后,窗口就要将自己画出来
整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
绘图设备是指继承QPainterDevice**的子类。**Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。其中,
/1.画画实例
画画的人 —— QPainter 画笔 —— QPen 画布 —— QPaintDevice
QPainter (参数是绘图设备 ,this表示在窗口上绘图) drawLine 划线 , 两点成一线,参数就是两个点的坐标 drawRect 矩形 , 参数是 左上角的点和 宽和高 drawEllips 画椭圆 , 参数是 左上角的点和 宽和高 ,另一种方式就是 圆心 + rx + ry
设置画家的画笔 setPen ( QPen) ,画笔可以设置颜色和风格 设置画家的画刷 setBrush(QBrush) , 填充封闭的图形, 也可以设置颜色 ,默认情况下,画刷不填充,还得设置风格
搬动画家 translate ( x, y) 将画家移动到某个坐标开始画画
QPainter painter(this);
//画家偏移,搬动画家到某个坐标上开始画画
painter.translate(100,0);
//创建一支画笔
QPen pen;
pen.setColor(QColor(255,0,0));
//设置笔宽
pen.setWidth(3);
//设置画笔的风格
pen.setStyle(Qt::DashLine);
//画家设置画笔
painter.setPen(pen);
//需要填充,使用画刷
QBrush brush;
brush.setColor(Qt::cyan);
//默认情况下,画刷不填充,还得设置风格
brush.setStyle(Qt::Dense4Pattern);
//画家设置画刷
painter.setBrush(brush);
//画一条线
painter.drawLine(0,0,100,100);
//画矩形
painter.drawRect(20,20,50,50);
//画圆形,使用椭圆
painter.drawEllipse(QPoint(100,100),50,50);
//画文字
painter.drawText(200,100,"好好学习,天天向上");
2.手动触发绘图事件
void Widget::on_pushButton_clicked()
{
x += 10;
this->update();
}
3.绘图设备 QPixmap
//QImage作为绘图设备
QImage img(300,300,QImage::Format_RGB32);
//默认情况下pixmap是黑色填充
img.fill(Qt::white);
QPainter painter(&img);
painter.setPen(QColor(255,0,0));
painter.drawEllipse(QPoint(150,150),100,100);
img.save("G:\\C7_Qt\\day03\\04_lessonNote\\img.png");
笔记来源