QT构建窗体(父窗体传为野指针)异常案例
2023-09-14 09:12:19 时间
【1】源码
工作中,时常会遇到各种各样的异常场景,有些异常场景很常见,必要备录,以防再犯。
分享本案例为:QT创建窗体时parent父窗体传野指针引起异常。
本案例源码如下:
1.1 默认新建一个QT工程(ps:本地QT版本为5.3)
(1)工程目录结构
(2)工程pro文件
1 QT += core gui 2 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 5 TARGET = CustomComboBox 6 TEMPLATE = app 7 8 9 SOURCES += main.cpp\ 10 mainwindow.cpp \ 11 customcombobox.cpp 12 13 HEADERS += mainwindow.h \ 14 customcombobox.h 15 16 FORMS += mainwindow.ui
1.2 实现自定义控件
(1)customcombobox.h
1 #ifndef CUSTOMCOMBOBOX_H 2 #define CUSTOMCOMBOBOX_H 3 4 #include <QComboBox> 5 6 class CustomComboBox : public QComboBox 7 { 8 public: 9 CustomComboBox(QWidget* parent = NULL); 10 }; 11 12 #endif // CUSTOMCOMBOBOX_H
(2)customcombobox.cpp
1 #include "customcombobox.h" 2 3 CustomComboBox::CustomComboBox(QWidget *parent) 4 : QComboBox(parent) 5 { 6 }
1.3 利用自定义控件
(1)mainwindow.h
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QFrame> 5 #include <QMainWindow> 6 #include "customcombobox.h" 7 8 namespace Ui 9 { 10 class MainWindow; 11 } 12 13 class MainWindow : public QMainWindow 14 { 15 Q_OBJECT 16 17 public: 18 explicit MainWindow(QWidget *parent = 0); 19 ~MainWindow(); 20 21 private: 22 void init(); 23 24 private: 25 QFrame *m_pFrame; 26 Ui::MainWindow *m_pUI; 27 CustomComboBox *m_pComboBox; 28 }; 29 30 #endif // MAINWINDOW_H
(2)mainwindow.cpp
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 4 MainWindow::MainWindow(QWidget *parent) 5 : QMainWindow(parent) 6 , m_pUI(new Ui::MainWindow) 7 { 8 m_pUI->setupUi(this); 9 init(); 10 } 11 12 MainWindow::~MainWindow() 13 { 14 delete m_pUI; 15 } 16 17 void MainWindow::init() 18 { 19 // TODO ....实际应用复杂 20 m_pComboBox = new CustomComboBox(m_pFrame); 21 // TODO .... 22 }
1.4 main函数
(1)main.cpp
1 #include "mainwindow.h" 2 #include <QApplication> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 MainWindow w; 8 w.show(); 9 10 return a.exec(); 11 }
【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-Qt设置背景图片
- QT-Qt图片按钮类
- QT-Qt组件QTimer使用方法
- QT-在Qt Widgets Application中怎么显示printf的输出内容?
- Qt-char*与QString互转 floatToqstring char*与QString互转 qt字符串与字符串数组操作 Qt 的QString类的使用
- s3c2410上搭建QT/Embedded4.8.5开发环境(四)--安装intel-x86 X11平台qt库qt-everywhere-opensource-src-4.8.5
- Qt编写视频监控系统71-外网访问摄像头等设备(获取各种信息及拉流)
- Qt开源作品30-农历控件
- Qt编写地图综合应用57-跨平台(win、linux、mac、uos、kylin等)
- Qt Windows打包程序脚本
- Qt 关于QT_BEGIN_NAMESPACE宏的作用
- Qt-消息对话框的设计
- Qt数据库编程
- Qt quick案例:图片演示器开发
- Qt开发-QT Widgets
- QT实现多线程两种方式案例详解
- C++QT实现压缩文件、文件夹和解压缩操作
- 【Qt】在ubuntu上为可执行程序qt创建图标(亲测)
- 【Qt】在ubuntu上安装qt的mqtt模块
- Qt之调用笔记本摄像头录像功能
- Qt QTabWidget隐藏某些tab
- 【Qt】加载.h文件显示窗体并添加交互逻辑
- QT案例实战1 - 从零开始编写一个OCR工具软件 (3)创建项目
- QT案例实战1 - 从零开始编写一个OCR工具软件 (1)简述
- QT creator使用(二):Qt项目建立、编译、运行、发布及移植