最近在看《Qt Creator快速入门》 一书,以前也用过Qt,但就像半路出家的和尚,很多部件并不知道作用也没用过,有时为实现某种效果遇到困难时去百度,即使实现了往往知其然而不知其所以然。所以才准备看这本书,看了也收获颇丰。
总结一下我今天的一些感想,也是之前不太理解的地方。
(1)以前经常实现自己的某个窗口或部件时,都会写自己的类,当然框架它会自己生成。
例
(1)class MyLineEdit : public QLineEdit
(2){
(3) Q_OBJECT
(4)public:
(5) explicit MyLineEdit(QMainWindow *parent = 0);
(6)
(7)signals:
(8)
(9)protected:
(10) void keyPressEvent(QKeyEvent *event);
(11)
(12)public slots:
(13)};
(1)第一句public QLineEdit表明它继承的父类是QLineEdit
(2)第二局在这个类里面使用了宏Q_OBJECT,这个宏的作用是为了让你能用信号与槽的机制。
(3)第五句explicit关键字是为了防止构造函数的隐式转化,什么是隐式转化取个栗子:
CExample objFour = 12; //执行了隐式转换,等价于CExample temp(12);objFour(temp); 至于Qt构造函数为什么写上它,是希望所有构造函数都被显式调用
(4)构造函数的形参类型QMainWindow是由父窗口的类型决定的,比如MyLineEdit p = new MyLineEdit(this);this是哪种类的类内指针,构造函数就是的类型就是哪种类,至于=0的意思就是可以不写这个参数
(5) Qt的父类和父对象是两种不一样的概念,父类对应的是c++中的继承,父对象是Qt巧妙的构造方法,这种机制有一种好处:在Qt中,当以QObject为父类的对象析构时,他会自动删除它所包含的所有子对象,实现了简单的垃圾回收机制,避免了内存泄露。所以开发时可以考虑,每个new出来的对象尽量设置父对象,这样即使未显示调用delete,只要保证父对象被析构,就能避免内存泄露。
上面的话是网上摘录的,说的特别好,就复制过来了。
而Qt构造函数初始化列表一般有这句QLineEdit(parent),这个就是为了调用父类的构造函数,当然生成父类对象依旧是在这个垃圾回收机制内的,看到这个参数parent就清楚了
(6)窗口和部件时不一样的,窗口有边框和标题,部件没有,在窗口的构造函数内写上几句话
QLineEdit *p1 = new QlineEdit(this);
QWidget *p2 = new QWidget(this);
当main.cpp函数内调用父窗口的show函数时,你会发现p1显示在父窗口,但p2没有显示,但如果你在构造函数内加一句p2->show(); p2也会显示。
大体可以这么解释,QWidget是顶级窗口部件(有边框标题的窗体),不特殊设置不会被嵌套到其他窗口,而lineEdit属于窗口部件,父窗口的show函数会显示对象内所有可以在父窗口显示的子窗口和父窗口本身,除此之外的顶级窗口请另行show。更形象的说法是Widget MainWindow之类的是容器,而label lineEdit是放在容器内的东西,一个容器的show只能看到这个容器和容器内的东西,而看不到其他。
除此之外,在新窗口的构造函数中加上这句话:setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);hide();另可以使用move移到合适位置。此位置相对于父窗口而言,而非桌面或者其他窗口或者使用dockwidget也可以实现窗口嵌套