Qt中继承控件重写paintEvent函数后没有显示的问题解决

        今天一个同学遇到了一个问题,是这样的:她写了一个继承QLabel的派生,重写了里面的paintEvent函数,创建对象并set了图片进去,编译没错,正常运行,结果就是那个label什么都没有显示出来.

        我最初以为是她的paintEvent没写好,于是在里面调用了父类的paintEvent,并直接在uilabel中写入一串字符,可运行后还是什么都没有显示.于是我怀疑那个paintEvent跟本就没有被调用过,于是调试了一下,果然.

        然而我一直想不懂为什么paintEvent会没有调用.

        直到她突然发现要在派生类构造函数后面加上成员初始化列表:QLabel(parent),然后程序就好了.

        原来是省略了成员初始化列表惹的祸.

        基类对象必须首先被创建,如果不调用基类构造函数,程序将会使用默认的基类构造函数.多数情况下,编译器为类生成一个公有的默认构造函数,只有下面两种情况例外:

        1.一个类显式地声明了任何构造函数,编译器不生成公有的默认构造函数。这这种情况下,如果程序需要一个默认构造函数,需要由类的设计者提供。

        2.一个类声明了一个非公有的默认构造函数,编译器不会生成公有的默认构造函数。

        查看了qt源码中qlabel类的定义,发现它是有显示声明了构造函数的,所以不会生成默认构造函数,因此必须得在派生QLabel类的构造函数后面加上成员初始化列表:QLabel(parent),这样才能正确地创建基类对象,从而正确地创建派生类对象.


你可能感兴趣的:(QT使用技巧)