qt部件构造函数问题
自定义一个labelexplicitMyLabel(QWidget*parent=0);与explicitMyLabel(QObject*parent=0);的区别在哪?...
自定义一个label
explicit MyLabel(QWidget *parent = 0);
与
explicit MyLabel(QObject*parent = 0);
的区别在哪?
为什么前者这样,就可以拥有paintEvent函数,后者就不行呢?
构造函数里的参数到底是什么意思? 展开
explicit MyLabel(QWidget *parent = 0);
与
explicit MyLabel(QObject*parent = 0);
的区别在哪?
为什么前者这样,就可以拥有paintEvent函数,后者就不行呢?
构造函数里的参数到底是什么意思? 展开
1个回答
展开全部
QObject 提供了信号与槽、多语言、Qt垃圾回收等Qt核心机制。它是Qt中所有对象的基类。
QWidget,顾名思义,就是窗体部件的基类,比如QDialog、QLabel等都直接或间接继承自它。它提供了一些窗体部件专有的信号与槽。QtWidget自然也继承自QObject。
一般上,在使用Qt
Creator创建一个类时,Qt会询问你该类的基类是什么、类型信息是什么等。如果你的类是继承自形如QPushButton、QDialog、
QMainWindow、QLabel的,那么,使用explicit MyLabel(QWidget *parent =
0);。如果你的类继承自QString等类,那么使用explicit MyString(QObject*parent = 0);。
这里的QObject *parent也好,QWidget *parent也好,都是为了给对象指定从属关系。比如,
explicit MyLabel(QWidget *parent = 0);
这样:
QDialog dialog;
MyLabel *label = new MyLabel(&dialog);
就指定了label是作为dialog的一个child存在的。当dialog被销毁时,它的所有children都会被自动销毁。所以在Qt中,只要我们在动态创建对象时显式或隐式(比如通过Layout、setCentralWidget等)指定了对象的从属关系,那么这个对象就会在其父对象销毁的时刻被Qt自动销毁,而无需你自己再调用delete了。
QWidget,顾名思义,就是窗体部件的基类,比如QDialog、QLabel等都直接或间接继承自它。它提供了一些窗体部件专有的信号与槽。QtWidget自然也继承自QObject。
一般上,在使用Qt
Creator创建一个类时,Qt会询问你该类的基类是什么、类型信息是什么等。如果你的类是继承自形如QPushButton、QDialog、
QMainWindow、QLabel的,那么,使用explicit MyLabel(QWidget *parent =
0);。如果你的类继承自QString等类,那么使用explicit MyString(QObject*parent = 0);。
这里的QObject *parent也好,QWidget *parent也好,都是为了给对象指定从属关系。比如,
explicit MyLabel(QWidget *parent = 0);
这样:
QDialog dialog;
MyLabel *label = new MyLabel(&dialog);
就指定了label是作为dialog的一个child存在的。当dialog被销毁时,它的所有children都会被自动销毁。所以在Qt中,只要我们在动态创建对象时显式或隐式(比如通过Layout、setCentralWidget等)指定了对象的从属关系,那么这个对象就会在其父对象销毁的时刻被Qt自动销毁,而无需你自己再调用delete了。
更多追问追答
追问
也就是说构造函数中的参数,代表它指定的父类么?
也就是说构造函数中的形参指定的是父类?
可是一般来讲,指定父类,继承父类不是class MyLabel : public QLabel这么指定吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询