zoukankan      html  css  js  c++  java
  • QT学习笔记3:QT中语法说明

    一、Qt 类中Q_OBJECT的作用

    QObject 是所有Qt对象的基类。

    QObject 是Qt模块的核心。它的最主要特征是关于对象间无缝通信的机制:信号与槽。使用connect()建立信号到槽的连接,使用disconnect()销毁连接,使用blockSignals()暂时阻塞信号以避免无限通知循环,使用connectNotify()和disconnectNotify()追踪连接。

    宏Q_OBJECT是任何实现信号、槽或属性的强制性要求。不管是否需要实现这些机制,都要求使用这个宏。否则会引发一些函数的奇怪行为。

    二、加入q_object编译不过问题解决

    如果一个项目开始没有用Q_OBJECT,后来因为业务需求加入Q_OBJECT,在该类头文件中加了#include<QObject>,再让该类继承QObject,加上Q_OBJECT宏来支持信号与槽,这样会出现各种莫名其妙的错误
    class  TOPIScanningLine : public QGraphicsItem,public QObject
    {
        Q_OBJECT
    }
    尝试着把Q_OBJECT宏给删掉
    然后编译通过了,但是这样就不能使用信号与槽机制
    解决方法:
    QObject继承要写在第一个,不然Q_OBJECT就不起作用,所以将继承放在第一位,例如
    class  TOPIScanningLine :public QObject, public QGraphicsItem
    {
        Q_OBJECT
    }

     这样就能成功编译。

    三、emit的使用

    假设现在定义了一个类A,现在想在A的一个函数void A::function1()当中的结尾处emit一个信号signal1(),然后利用这个信号触发另一个类B进行某项操作void B::function2(),connect应该如何书写

    比如在一个QMainwindow中,包含类A,B的头文件,是的类A,和类B可见,定义一个类A *a,和一个类B *b,(要分配空间)。就可以这么connect他们。
    connect(a,SIGNAL(signal1()),b,SLOT(function2())); 
    对于A,B两个类出来都必须继承于QObject类。

    代码:

    //类A头文件  要有Signals
    signals://鼠标移动信号
        void  mouseMoveSignal(); //鼠标移动
    
    //类A   某函数释放信号
    void TOPIScanningLine::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
    {
        emit  mouseMoveSignal();//释放信号
        QGraphicsItem::mouseMoveEvent(event);
    }
    
    //类B头文件   需要有槽函数
    public slots://槽函数
        void GetDistanceUp();//更新上图距离
    
    //类B  函数链接
    TOPIPic_Up = new TOPIScanningLine();//一定要实例化
    connect(TOPIPic_Up, SIGNAL(mouseMoveSignal()), this, SLOT(GetDistanceUp()));

     四、QT绘制直线、矩形、圆

    1.添加头文件

    #include <QPainter>

    2.重写paintEvent函数,代码如下:

    void MainWindow::paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
        painter.setPen(QPen(Qt::blue,2));//设置画笔形式
        painter.drawLine(20,20,220,220);//画直线
        painter.drawLine(20,220,220,20);
        painter.drawEllipse(20,20,200,200);//画圆
        painter.drawRect(20,20,200,200);//画矩形
    }

    3.函数需要在头文件中声明

    protected:
        void paintEvent(QPaintEvent *);
  • 相关阅读:
    开放个人电脑端口[Windows]
    mysql局域网服务搭建
    JS数据分组[JSON]
    网站缓存【我只是单纯的保存网站!】
    JS生成数字加减乘法验证码
    【http反向代理】多个域名指向同一个ip的不同网站解决方法
    JQuery获取ID含有特殊字符的DOM元素
    java.lang.NoClassDefFoundError: org/apache/commons/collections4/ListValuedMap
    大型网站技术架构,6网站的伸缩性架构之分布式缓存集群的伸缩性设计
    大型网站技术架构,6网站的伸缩性架构之应用服务器集群的伸缩性设计
  • 原文地址:https://www.cnblogs.com/aiguona/p/9995423.html
Copyright © 2011-2022 走看看