【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构建窗体(父窗体传为野指针)异常案例的更多相关文章

  1. 使用AFNetworking时, 控制器点击返回销毁了, 但还是会执行请求成功或失败的block, 导致野指针异常

    原本我以为是我程序框架有问题...后来才知道, 无知真可怕... __unsafe_unretained __block typeof(self) weakSelf = self; AFHTTPSes ...

  2. C# 子窗体点击按钮产生的新子窗体放在父窗体里

    情景展示: 父窗体Form1,左边是按钮,右边是panel(放置子窗体) 父窗体点击按钮,在panel显示第一个子窗体AA, AA有个按钮,点击按钮,是第二个子窗体ZZ, 怎样将AA的子窗体ZZ也显示 ...

  3. 不创建父窗体的情况下他其他窗体的信息显示在第一个打开的窗体!(winfrom)

    公司使用vs2008做的东西,用vs2017都打不开了(编译错误) 叫我更新一下,我看了一下,08的项目 和 winform 差不多  如何就用winfrom来做了 (winform  很久没碰了,, ...

  4. Qt 子窗体嵌入父窗体

    1.创建个子窗体QDialog.在子窗体构造函数添加 Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { u ...

  5. 【QT】在子窗体中控制父窗体

    [背景说明]我的主窗体的名字叫做MainWindow,其子窗口是一个叫subDialog的类.我现在想做的是在子窗口的函数中调用父窗口. 在父窗口中打开子窗口 //弹出对话框确定变换的参数 subDi ...

  6. Qt — 子窗体操作父窗体中的方法

    父窗体与子窗体各自的代码如下: 1.  父窗体的代码: void FartherWindow::addactions() { SubWindow subwindow(this); // 把父窗体本身t ...

  7. qt 给父窗体设置样式不影响子控件样式以及子控件设置透明

    1.父窗体样式不生效? this->setAttribute(Qt::WA_StyledBackground); 2.父窗样式体影响子控件? this->setStyleSheet(&qu ...

  8. WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体

    原文:http://blog.csdn.net/kiss0622/article/details/5852153 方法一: 1.父窗口代码 Window1.xaml.cs private void B ...

  9. 附实例!实现iframe父窗体与子窗体的通信

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息.同时本 ...

随机推荐

  1. python接口测试实例--数据驱动(程序与数据分离)

    #encoding=utf-8import requestsimport jsonimport osimport hashlibimport picklefrom conf import * stat ...

  2. Servlet (三)HttpServletResponse

    package cn.sasa.serv; import java.io.IOException; import javax.servlet.ServletException; import java ...

  3. DVD租赁系统

    跟着网上的视频学的,还有个别地方写的不够好,主要学习dao模式,这里其中的BaseUtil类不错 DVD.java package com.dvd.entiy; public class DVD { ...

  4. 【JMeter】【性能测试】正则表达式关联

    1:登录接口 这里有一个实际的登录接口,在响应中返回了一串token,如下图 那么我们在接下来的接口-经验库列表中,就必须带入这一串token,否则响应报错,如下图所示   测试开发交流群 31776 ...

  5. Jmeter测试实践:文件上传接口

    1.打开jmeter4.0,新建测试计划,添加线程组.根据实际情况配置线程属性. 2.添加HTTP请求. Basic部分修改如下: Advanced部分我做任何修改,完全保持默认.但是有人说Imple ...

  6. PHP数组对象对比机制

    $a = [1,2]; $b = [1,'2']; var_dump($a == $b); // true var_dump($a === $b); // false $c = ['ab'=>' ...

  7. mac上mysql root密码忘记或权限错误的解决办法

    以下方法亲测有效,过程使用的工具只有mac的终端无需workbench 当我们通过终端连接mysql数据库时候我们会看到这样的信息 ERROR 1045: Access denied for user ...

  8. git flow 使用步骤

    Mac安装git-flow:brew install git-flow 克隆新代码:git clone git@gitlab.xxx.cn:abc/test.git 切换到远程的develop分支(很 ...

  9. Scala泛型[T]的使用

    package com.dtspark.scala.basics /** * 1,scala的类和方法.函数都可以是泛型. * * 2,关于对类型边界的限定分为上边界和下边界(对类进行限制) * 上边 ...

  10. api-gateway-engine知识点(2)

    GroupVersion实现engine本地缓存 package com.inspur.cloud.apigw.engine.cache; import java.util.Map;import ja ...