QT_仅仅直接在构造函数中创建对象的不可行的原因
#include "mainwidget.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w;//执行QApplication的构造函数,所以为了减少主函数的代码量,将其他的子窗口放在其构造函数即可(就会自动的执行)
w.show(); return a.exec();
}
在主程序中不停的添加代码是不可行的,这是由于当一个界面中有一百个按钮时,就要在主程序中创建100个对象,这样的代码可读性不高,太难看了。
由以上的注释内容可以得知,程序在执行时,会自动先执行构造函数, 不如将界面中的控件放在构造函数中,这样就可以减少主程序代码的数量,
#include "mainwidget.h" #include <QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{ QPushButton btn1;
QPushButton btn2; btn1.setParent(this);
btn1.setText("1111");
btn1.move(100,100); btn2.setParent(this);
btn2.setText("22222"); } MainWidget::~MainWidget()
{ }
如果仅仅是在构造函数中创建了如上面的代码的时候,当运行的时候会发现,界面中并没有控件的显示,这是因为仅仅在此构造函数中创建了对象以及他的属性,相当于创建了一个临时变量,当构造函数执行结束的时候,便会释放,等于没有创建。此时需要在构造函数的头文件中添加如下所示的代码,将其转化为全局变量;
#ifndef MAINWIDGET_H
#define MAINWIDGET_H #include <QWidget> #include <QPushButton> class MainWidget : public QWidget
{
Q_OBJECT public:
MainWidget(QWidget *parent = 0);
~MainWidget(); private:
QPushButton btn1;
QPushButton btn2;
}; #endif // MAINWIDGET_H
或者使用构造函数传参的方式(利用指针)
#ifndef MAINWIDGET_H
#define MAINWIDGET_H #include <QWidget> #include <QPushButton> class MainWidget : public QWidget
{
Q_OBJECT public:
MainWidget(QWidget *parent = 0);
~MainWidget(); private:
QPushButton btn1;
QPushButton *btn2;
}; #endif // MAINWIDGET_H
添加头文件QPushButton,在文件中添加了
QPushButton btn1;
QPushButton btn2; 所以在构造函数中就没必要创建对象。只需要拿来使用即可;
#include "mainwidget.h" #include <QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{ // QPushButton btn1;
// QPushButton btn2; btn1.setParent(this);
btn1.setText("1111");
btn1.move(100,100); btn2.setParent(this);
btn2.setText("22222"); } MainWidget::~MainWidget()
{ }
或者利用构造函数传参的方式
#include "mainwidget.h" #include <QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{ // QPushButton btn1;
// QPushButton btn2; btn1.setParent(this);
btn1.setText("1111");
btn1.move(100,100); btn2 = new QPushButton(this);//指针没有空间,是需要动态的对其进行空间的分配
btn2 ->setParent(this);
btn2 ->setText("22222"); } MainWidget::~MainWidget()
{ }
综上所述:在创建对象的时候,一定要在头文件中声明,保证创建的是全局变量。防止知识创建了局部的变量;导致程序运行出现不了想要的结果。
QT_仅仅直接在构造函数中创建对象的不可行的原因的更多相关文章
- [Effective JavaScript 笔记]第38条:在子类的构造函数中调用父类的构造函数
示例 场景类 场景图(scene)是在可视化的过程中(如游戏或图形仿真场景)描述一个场景的对象集合.一个简单的场景包含了在该场景中的所有对象(称角色),以及所有角色的预加载图像数据集,还包含一个底层图 ...
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
- anjular中Service、Factory、Provider的使用与js中创建对象的总结
在学习anjular中Service的使用时,发现和js中的创建对象的方式有一定的联系,所以总结了anjular中Service.Factory.Provider的使用方式与js创建对象的方式 一.先 ...
- 探索js原型链和vue构造函数中的奥妙
这篇文章首先会讲到原型链以及原型链的一些概念,然后会通过分析vue的源码,来看一下vue的构造函数是如何被创建的,now we go! 一.什么是原型链? 简单回顾下构造函数,原型和实例的关系: ...
- Javascirpt中创建对象的几种方式
js是一种动态语言,即js的对象创建好之后可以随意修改,因此JS对象的面向对象编程部分更可以说是通过JS的怪异特性来模拟Java这类的面向对象编程的.下面首先讨论几种创建对象的方式: 1. 工厂模式创 ...
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- js中创建对象的几种方式
创建对象指创建一个object并给这个对象添加属性和方法,有以下几个方式: 最基本的: var Person={}; Person.name='tom'; Person.age='20'; Perso ...
- JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习
虽然经常说是做前端开发的,但常常使用的技术反而是JQuery比较多一点.在JavaScript的使用上相对而言少些.尤其是在创建对象使用原型链继承上面,在项目开发中很少用到.所以今天做个demo练习一 ...
- 郑州尚学堂:如何在Java中创建对象
作为Java开发者,每天都会创建大量的对象,但是,我们总是使用管理依赖系统(如Spring框架)来创建这些对象.其实还有其他方法可以创建对象,在接下来的文章中我会进行详细介绍. 1.使用new关键字 ...
随机推荐
- javascript ==等于与===恒等于
==判断是否等于,只判断数值 ===代表恒等于,不仅判断数值,而且判断类型 var a=5; var b="5"; (a b 只是数值上相等,但是类型并不相等) a==b //tr ...
- 【旧文章搬运】如何从EPROCESS辨别一个进程是否已退出
原文发表于百度空间,2008-7-31========================================================================== 前面已经通过 ...
- centos7安装redis3.2.12
1.准备安装包,放在/usr/local/src/ 2.解压安装包,解压到/usr/local/ tar zxf redis-3.2.12.tar.gz -C /usr/local/ 3.cd /us ...
- 024--python re、logging、configparser、hashlib模块
一.re模块 re模块又称正则表达式是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹 ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 16. 角色管理
注入UserManager和RoleManager 建立View页面.这段视频中没有录. RoleManager的服务没有注册 注册的地方进行修改 再次运行就可以了 这个ViewModel实际上只需要 ...
- LuoguP1370 Charlie的云笔记序列 【dp】By cellur925
题目传送门 题目大意:给你一个序列,求出它所有区间的本质不同的子序列个数.(空序列也算作本质不同),数据范围$1e5$. 我们肯定是不能一个个枚举区间的...而且这个复杂度下,也就大概$O(n)$或$ ...
- Zabbix-Server 添加主机
之前讲解了如何配置Zabbix 服务端和客户端,现在我们来讲解下如何在zabbix监控端添加主机 Zabbix服务端:Centos 配置 Zabbix服务端 Zabbix客户端:Centos 配置 Z ...
- Music in Car CodeForces - 746F
Music in Car CodeForces - 746F 题意很难懂啊... 题意:http://blog.csdn.net/a838502647/article/details/74831793 ...
- port 22: Connection refused
issue: os>ssh 196.168.27.90ssh: connect to host 196.168.27.90 port 22: Connection refused solutio ...
- jQuery attr() 源码解读
我们知道,$().attr()实质上是内部调用了jQuery.access方法,在调用时jQuery.attr作为回调传入.在通过种种判断(参看jQuery.access()方法)之后,取值和赋值最后 ...