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.事件

199609_71d1d10891-01_事件分发

单个具体的事件处理
    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");



笔记来源

https://kxd.lanzoul.com/iehzw0xugwwj
posted @ 2023-05-23 22:38  大橘|博客  阅读(33)  评论(0)    收藏  举报