• Qt中关于信号和槽的基本知识_QTimer类


    Qt中关于信号和槽的基本知识

    信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用

    槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制

    连接:信号和槽通过connect建立连接

    连接信号与槽是connect()函数,原型如下:

    bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection ) [static]  //组后一个参数一般不加,保持默认

    它可以把一个对象(sender)发送的信号(signal)和接收者(receiver)的槽函数(method)关联起来,这样当信号产生时与之关联的槽函数就会被执行。在connect函数里面我们用到了Qt提供的两个宏SIGNAL()和SLOT();这是Qt要求的,要关联信号和槽必须借助于这两个宏,两个宏的定义如下:

    #define SLOT(name) "1"#name

    #define SIGNAL(name) "2"#name

    通过这两个宏,就可以把我们传递进去的槽和信号的名字转化成字符串,并在这两个字符串前面加上附加的字符。

    如:

    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(myslots()));

    经过moc处理后就变成:

    connect(ui->pushButton, "2clicked()", this, "1myslots()");

    槽可以被取消链接:

    bool QObject::disconnect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method ) [static]

    这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。

        要连接在一起的信号和槽,如果带了参数,那么这些参数的顺序和类型都要一致,并且信号带的参数的个数可以多于槽,信号在发射的时候可以把参数传递给槽函数接收,这也是不同对象交互数据的一个方法,信号可以发送多个类型的数据给槽函数,但是槽函数不一定需要全部接收处理,这样槽函数参数的个数可以少于或者等于信号参数的个数,但一定不能多于所连接信号的参数个数。为了正确的连接信号槽,信号和槽的参数类型以及出现的顺序必须相同。

    参考博客:

    https://blog.csdn.net/bzhxuexi/article/details/45483879

    https://blog.csdn.net/guozirong123/article/details/73044742

     QTimer类

    QTimer类提供了重复和单次触发信号的定时器。

    QTimer类为定时器提供了一个高级别的编程接口。很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用start(),然后在恒定的时间间隔会发射timeout()信号。

    注意:当QTimer的父对象被销毁时,它也会被自动销毁。

    例如:start()之后,每秒都会调用update()。

    1 QTimer *timer = new QTimer(this);
    2 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    3 timer->start(1000);  //每1000ms触发一次

    如果我们想让这个计时器只计时一次,那么必须使用void setSingleShot(bool singleShot)函数。

    1 QTimer *timer = new QTimer(this);
    2 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    3 timer->setsetSingleShot(true);  //表示只计时一次
    4 timer->start(60000);

    成员函数:

    (1)  void start(int msec) 

           启动或重新启动一个超时时间间隔为毫秒的定时器。

           如果定时器正在运行,它将被停止和重新启动。如果singleShot为true,定时器将只激活一次。

    (2)   void setSingleShot(bool singleShot) 

       设置定时器是否为单次触发。

       单次触发定时器只触发一次,非单次的话,则每过一个时间间隔都会触发。

    (3)   void stop() 
            停止定时器。

    (4)   void timeout() 

      定时器超时后,这个信号被发射。

      注意:这是一个私有的信号。它可以在信号连接使用,但不能由用户发出。

     QTimer类关联槽的方法

    1 QTimer* timer = new QTimer(this);   //QTimer(this)表示使用带QTimer对象的参数的QTimer构造函数对timer进行初始化
    2 timer->start(500);  //每500ms,timeout()发送一次信号  timer->stop();//停止计时
    3 connect(timer, SIGNAL(timeout()), this, SLOT(Graph_Show()));  //连接信号和槽

    参考博客:

    https://blog.csdn.net/zz2862625432/article/details/79550285

    Qtime类

    Qtime类构造函数

    QTime()  构造一个时间为0的对象

    QTime(int h, int m, int s = 0, int ms = 0)    构造一个具有初始时间的对象

    #include <QDebug>
    #include <QTime>
    #pragma execution_character_set("utf-8")//Qt5 显示中文
    
    //计算程序运行时间方法
    QTime timedebuge;//声明一个时钟对象
    timedebuge.start();//开始计时
        /*
              中间为你的程序
        */
    qDebug()<<"第一段程序耗时:"<<timedebuge.elapsed()/1000.0<<"s";//输出计时

    成员函数

    void start()  将当前系统时间记录为当前时间

    int restart()    将当前系统时间记录为当前时间,并返回距离上次呼叫start()或者restart()函数间隔的毫秒数

    QTime currentTime()    得到当前的系统时间

    int elapsed() const  计算与最近一次呼叫start()或者restart()函数间隔的毫秒数,相当于计时器

    获取当前时间,显示格式为:

     1 QString Widget::getSystemTime()
     2 {
     3     QTime *time = new QTime();
     4  
     5     QString strTime;
     6  
     7     strTime = time->currentTime().toString("hh:mm:ss");
     8  
     9     return strTime;
    10 }

     QString QTime::toString(const QString &format) const   // format为要将时间格式化的格式,格式详情参照帮助文档, 以下是常用类型

                                                  hh:mm:ss.zzz                    显示格式为:14:13:09.042

                                                  h:m:s ap                            显示格式为:2:13:9 pm

                                                  H:m:s a                              显示格式为:14:13:9 pm

                                                  hh::mm::s                          显示格式为:14:13:9

    https://blog.csdn.net/founderznd/article/details/51442629

    Qt中的QMessage详解

    QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);

    QMessageBox::warning(NULL, "warning", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);

    Qt中一些基本类的介绍:https://www.cnblogs.com/billxyd/p/6773183.html

        QT提供的默认基类只有QMainWindow、QWidget、和QDialog这三种,这三种窗体也是用的最多的,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而他们全部继承自QWidget。不仅如此,所以的窗口部件都继承自QWidget,继承关系如图所示。

    https://blog.csdn.net/kilotwo/article/details/79238545

    Qt中 int ,float ,double转换为QString

    把QString转换为 double类型

    方法1

    1 QString str="123.45"; 
    2 double val=str.toDouble(); //val=123.45 

    方法2:很适合科学计数法形式转换

    1 bool ok; 
    2 double d; 
    3 d=QString("1234.56e-02").toDouble(&ok); //ok=true;d;12.3456. 

    参考博客:

    https://www.cnblogs.com/lvchaoshun/p/7270576.html

    vs2017调试qt项目时,弹不出dos窗口的解决方法

    属性—>连接器—>系统—>子系统(在窗口右边)—>下拉框选择Console (/SUBSYSTEM:CONSOLE)

    QVector常见使用方法

    https://www.cnblogs.com/qianqiannian/p/9661778.html

    QCustomPlot类的介绍

    https://blog.csdn.net/lihuagedi/article/details/81137380

    Opencv中的Mat类

    矩阵数据类型:
        – CV_<bit_depth>(S|U|F)C<number_of_channels>
    S = 符号整型 U = 无符号整型 F = 浮点型

    CV_8UC1 是指一个8位无符号整型单通道矩阵,
    CV_32FC2是指一个32位浮点型双通道矩阵
    CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
    CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
    CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
    CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
    CV_32SC1 CV_32FC1 CV_64FC1
    CV_32SC2 CV_32FC2 CV_64FC2
    CV_32SC3 CV_32FC3 CV_64FC3
    CV_32SC4 CV_32FC4 CV_64FC4

    其中,通道表示每个点能存放多少个数,类似于RGB彩色图中的每个像素点有三个值,即三通道的。
    图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8.

     Mat的介绍:

    https://blog.csdn.net/chen134225/article/details/80787665

    访问Mat矩阵的方法

    Mat是一个类,可以创建出用于存储数据的矩阵

    访问方法(1)

    1 A = cv::Mat::zeros(n + 1, 1, CV_64FC1);
    2 
    3 double y = A.at<double>(0, 0); //取出A中的第一行第一列中的数据赋值给y

    访问方法(2)

    1 A = cv::Mat::zeros(n + 1, 1, CV_64FC1);
    2 
    3 double* p = A.ptr<double>(0);  //y指向第一行(那个0)的第一个元素
    4 
    5 double y1 = p[0];  //将A中的第一行第一个元素赋值给y1
    6 double y2 = p[1];  //将A中得第二行第一个元素赋值给y2

     Qt多窗口切换

    https://blog.csdn.net/tiydy/article/details/83409726

    https://www.cnblogs.com/lsgxeva/p/7808906.html

  • 相关阅读:
    Spring实现声明式事务
    Spring整合MyBatis
    Spring AOP
    代理模式
    Bean的作用域
    Spring的配置
    HQL题目记录以及解题思路--持续更新
    数仓学习之路一:数仓理论
    DBeaver连接Hive遇到的坑
    MySQL常见面试题
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/11117001.html
Copyright © 2020-2023  润新知