QT构建窗体(父窗体传为野指针)异常案例
【1】源码
工作中,时常会遇到各种各样的异常场景,有些异常场景很常见,必要备录,以防再犯。
分享本案例为:QT创建窗体时parent父窗体传野指针引起异常。
本案例源码如下:
1.1 默认新建一个QT工程(ps:本地QT版本为5.3)
(1)工程目录结构
(2)工程pro文件
QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = CustomComboBox
TEMPLATE = app SOURCES += main.cpp\
mainwindow.cpp \
customcombobox.cpp HEADERS += mainwindow.h \
customcombobox.h FORMS += mainwindow.ui
1.2 实现自定义控件
(1)customcombobox.h
#ifndef CUSTOMCOMBOBOX_H
#define CUSTOMCOMBOBOX_H #include <QComboBox> class CustomComboBox : public QComboBox
{
public:
CustomComboBox(QWidget* parent = NULL);
}; #endif // CUSTOMCOMBOBOX_H
(2)customcombobox.cpp
#include "customcombobox.h" CustomComboBox::CustomComboBox(QWidget *parent)
: QComboBox(parent)
{
}
1.3 利用自定义控件
(1)mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QFrame>
#include <QMainWindow>
#include "customcombobox.h" namespace Ui
{
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private:
void init(); private:
QFrame *m_pFrame;
Ui::MainWindow *m_pUI;
CustomComboBox *m_pComboBox;
}; #endif // MAINWINDOW_H
(2)mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, m_pUI(new Ui::MainWindow)
{
m_pUI->setupUi(this);
init();
} MainWindow::~MainWindow()
{
delete m_pUI;
} void MainWindow::init()
{
// TODO ....实际应用复杂
m_pComboBox = new CustomComboBox(m_pFrame);
// TODO ....
}
1.4 main函数
(1)main.cpp
#include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}
【2】分析
2.1 崩溃堆栈
调试代码,异常堆栈是梳理问题的关键:由堆栈可定位发生问题的过程(即函数)。
2.2 局部对象
查看局部对象值,便于更具体的定位问题:由局部对象值可定位发生问题的对象(即成员变量)。
2.3 源码剖析(ps: 本地QT版本5.3,不同的QT版本,源码异常位置可能不同!)
QT源码分析(关于QT源码调试,参见随笔《QtCreator调试源码》),更具体查纠问题点:由源码可“知其然,更知其所以然”(即异常根本原因)
2.4 复原异常现场
结合以上所有的过程,弄清楚异常的来龙去脉。
【3】总结
切记,类中定义的指针成员变量,务必使用初始化列表规范进行强制初始化(默认置为NULL)。
Good Good Study, Day Day Up.
顺序 选择 循环 总结
QT构建窗体(父窗体传为野指针)异常案例的更多相关文章
- 使用AFNetworking时, 控制器点击返回销毁了, 但还是会执行请求成功或失败的block, 导致野指针异常
原本我以为是我程序框架有问题...后来才知道, 无知真可怕... __unsafe_unretained __block typeof(self) weakSelf = self; AFHTTPSes ...
- C# 子窗体点击按钮产生的新子窗体放在父窗体里
情景展示: 父窗体Form1,左边是按钮,右边是panel(放置子窗体) 父窗体点击按钮,在panel显示第一个子窗体AA, AA有个按钮,点击按钮,是第二个子窗体ZZ, 怎样将AA的子窗体ZZ也显示 ...
- 不创建父窗体的情况下他其他窗体的信息显示在第一个打开的窗体!(winfrom)
公司使用vs2008做的东西,用vs2017都打不开了(编译错误) 叫我更新一下,我看了一下,08的项目 和 winform 差不多 如何就用winfrom来做了 (winform 很久没碰了,, ...
- Qt 子窗体嵌入父窗体
1.创建个子窗体QDialog.在子窗体构造函数添加 Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { u ...
- 【QT】在子窗体中控制父窗体
[背景说明]我的主窗体的名字叫做MainWindow,其子窗口是一个叫subDialog的类.我现在想做的是在子窗口的函数中调用父窗口. 在父窗口中打开子窗口 //弹出对话框确定变换的参数 subDi ...
- Qt — 子窗体操作父窗体中的方法
父窗体与子窗体各自的代码如下: 1. 父窗体的代码: void FartherWindow::addactions() { SubWindow subwindow(this); // 把父窗体本身t ...
- qt 给父窗体设置样式不影响子控件样式以及子控件设置透明
1.父窗体样式不生效? this->setAttribute(Qt::WA_StyledBackground); 2.父窗样式体影响子控件? this->setStyleSheet(&qu ...
- WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体
原文:http://blog.csdn.net/kiss0622/article/details/5852153 方法一: 1.父窗口代码 Window1.xaml.cs private void B ...
- 附实例!实现iframe父窗体与子窗体的通信
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息.同时本 ...
随机推荐
- Ubuntu14.04 LTS 安装Chrome浏览器(转)
add zhj: 亲测过,可以,原来不用FQ就可以下载,有点意外 原文:http://www.jianshu.com/p/8220578d0b15 1.打开终端(ctrl + alt + t),下载6 ...
- centos7.6 安装与配置 MongoDB yum方式
1 创建yum源文件,添加以下内容 vim /etc/yum.repos.d/mongodb-org-4.0.repo [mongodb-org-4.0] name=MongoDB Repositor ...
- SSAS下玩转PowerShell
操作SSAS数据库的方法有非常多,是否有一种能够方法能够通过脚本自己主动去做这些事呢,比方处理分区,创建备份以及监视SSAS的执行状况. 原文地址: http://www.mssqltips ...
- VS2017使用Git进行源代码管理
步骤一:将解决方案添加到源代码管理 步骤二:进入团队资源管理器 双击存储库项目进入Git操作页面. 步骤三:同步本地代码到远程仓库 选择同步功能 步骤四:发布代码到Git 点击之后输入你要发布的git ...
- ROS安装(2)
1.Ubuntu无法启动了,进入不了启动界面 刚高兴一会会儿,马上系统重启,进不了登陆界面了.只有控制台的login,无语.试了好几种方法都没有解决. 重装吧!重装Ubuntu之后,装完ROS Kin ...
- [django]python异步神器-celery
python异步神器celery https://segmentfault.com/a/1190000007780963
- 【UML】-NO.40.UML.1.UML.1.001-【UML】- uml
1.0.0 Summary Tittle:[UML]-NO.40.UML.1.UML.1.001-[UML]- uml Style:DesignPattern Series:DesignPattern ...
- 安装ElasticSearch5.5.2 注意事项
官方文档中建议生产环境中打开 bootstrap.memory_lock: true 打开之后会报很多错误要优化一下系统参数 vim /etc/security/limits.conf * soft ...
- How to compile and install Snort from source code on Ubuntu
http://www.tuicool.com/articles/v6j2Ab Snort is by far the most popular open-source network intrusio ...
- python threading
//test.py 1 import threading 2 import time 3 4 exitFlag = 0 5 6 class myThread (threading.Thread): 7 ...