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关键字 ...
随机推荐
- oracle报错ORA-01843: not a valid month
转自:https://www.cnblogs.com/chonghaojie/p/9994625.html 客户端:select * from sys.nls_session_parameters;服 ...
- 【社群话题分享】LAMP 还是 LNMP 或者 ?
每周三下午的话题活动是又拍云技术社群的优良传统- 大家一起来看看这周都聊了些啥吧- 往期话题推荐: [社群话题分享]Linux 各大发行版你怎么选? [社群话题分享]数据权限该怎么放? [社群话题分享 ...
- python 之 配置环境变量、通过pip 安装第三方库
配置环境变量 右击桌面上的“此电脑”—>“属性”—>“高级系统设置”—>右下角“环境变量”—>双击“系统变量”里的“Path”—>点击“新建”—>输入python的 ...
- 跳马~~~HDU1372
基础BFS,水过就好~手写队列优化~~ #include <iostream> #include <stdio.h> #include <string.h> #in ...
- Linux 问题 卸载setup.py方式安装的python包
python ./setup.py install --record install.txt cat install.txt | xargs rm -rf
- bzoj4517[Sdoi2016]排列计数(组合数,错排)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1792 Solved: 1111[Submit][Stat ...
- Opencv读写文件
HSV也是用和RGB差不多的方式来表达像素,每个整形(integer) 向量分别表示一个B,G,R通道,其他的色彩空间,也用同样的方式来表示像素,只是取值范围和通道数目不同HSV的色彩空间的色度值范围 ...
- mac 配置nginx 虚拟域名(转载)
我是通过homebrew 安装nginx 的,所以安装目录是默认的,之前多个server都是放在默认安装目录下的nginx.conf里的,但是这样不太好,就是会导致nginx.conf 越来越长,而且 ...
- FlashFXP Registration
-------- FlashFXP Registration Data START --------FLASHFXPuQBW1wi5uQAAAACvW7cJKQXzmx8Eu6ikXL4LbrYQHZ ...
- Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) C
Description In the army, it isn't easy to form a group of soldiers that will be effective on the bat ...