• QT构建窗体(父窗体传为野指针)异常案例


    【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.

    顺序 选择 循环 总结

  • 相关阅读:
    Spring中关于view层的一些配置和使用方法
    Spring JDBC和Hibernate混用时,如何配置事务管理
    Oracle技巧2则
    说出我的故事
    只有MDF数据库文件的数据恢复(转)
    js技巧
    Oracle 统计信息(1)
    SQL优化解决思路
    Webspere 6集群和负载均衡配置和测试
    小招技巧: EXCEL文件导入数据库(转)
  • 原文地址:https://www.cnblogs.com/Braveliu/p/8577100.html
Copyright © 2020-2023  润新知