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 *);

 

 

posted @ 2018-11-21 15:34  爱国呐  阅读(2795)  评论(0编辑  收藏  举报