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父窗体与子窗体间的通信,传递数据信息.同时本 ...
随机推荐
- 【PyQt5-Qt Designer】QProgressBar() 进度条
QProgressBar() 进度条 QProgressBar简介 QProgressBar小部件提供了一个水平或垂直的进度条. 进度条用于向用户指示操作的进度,并向他们保证应用程序仍在运行. 进度条 ...
- 集合求交集 & 去除列表中重复的元素
集合求交集: set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 交集:set3 = set1 & set2 print(ste3) #结果为{4,5} 或者ste1. ...
- Vue项目
1.新建Vue项目:vue init webpack projectName 2.vue-router模块 1.安装vue-router模块:npm install vue-router --save ...
- 如何在js中将统计代码图标隐藏
建站时我们都会加一下网站统计,方便把控内容的内容的运营.大部分站长安装的站点统计是第三方统计代码,js形式的,很少用以服务器日志为基础分析的统计.(当然能通过网站日志来分析网站的运营者比一般的站长水平 ...
- 20170915 linux系统管理培训
进程管理 程序:通常为二进制程序放在存储媒介中(如光盘.硬盘.软盘.磁带等),以物理文件的形式存在: 进程:正在运行当中的程序,程序被触发后,执行者的权限与属性.程序的程序代码与所有数据等都会被加载到 ...
- Android使得Fragment 切换时不重新实例化
以前实现Fragment的切换都是用replace方法实现 public void startFragmentAdd(Fragment fragment) { FragmentManager frag ...
- postman测试iop中url时的idtoken
记得填写 X-Auth-Token 对应cookies中的 token_id
- Windows本机搭建Redis
1 下载安装包 GIT:https://github.com/MicrosoftArchive/redis/releases Redis-x64-3.2.100.zip 百度网盘 :链接: ...
- spring + mybatis配置及网络异常设置
Spring引入mybatis <beans xmlns="http://www.springframework.org/schema/beans" xmlns:contex ...
- SIP协议流程
1.注册流程: 2.注销流程: 3. 基本呼叫建立过程: 4. 会话更改流程: 5. 正常呼叫释放过程: 6. 被叫忙呼叫释放: 7.被叫无应答流程一: 8.被叫无应答流程二: 9.遇忙呼叫前转: