自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取:
https://www.cnblogs.com/bclshuai/p/11380657.html
1.問題描述
Qt的控件需要實現陰影效果和透明度變化的效果,但是一個控件只能通過setGraphicsEffect設置一個效果,但是在切換時會出現崩潰,出現如下錯誤。
//設置透明度效果
m_tipWidgetOpacity = new QGraphicsOpacityEffect(ui.widgetTips);
m_tipWidgetOpacity->setOpacity(1);
ui.widgetTips->setGraphicsEffect(m_tipWidgetOpacity);
//在設置陰影效果
m_widgetTipsShadowEffect = new QGraphicsDropShadowEffect(this);
m_widgetTipsShadowEffect->setOffset(0, 4); //陰影的偏移量
m_widgetTipsShadowEffect->setColor(QColor(0, 0, 0,0.08*255)); //陰影的顏色
m_widgetTipsShadowEffect->setBlurRadius(24); // 陰影圓角的大小
ui.widgetTips->setGraphicsEffect(m_widgetTipsShadowEffect);
//在設置透明度效果
ui.widgetTips->setGraphicsEffect(m_tipWidgetOpacity);
m_tipWidgetOpacity->setOpacity(1);//此處崩潰
0x000000006451CD00 (Qt5Widgets.dll) (FaceMatch.exe 中)處有未經處理的異常: 0xC0000005: 讀取位置 0x0000000100000008 時發生訪問衝突
0x000000006451CD00 (Qt5Widgets.dll) (FaceMatch.exe 中)處有未經處理的異常: 0xC0000005: 讀取位置 0x0000000100000008 時發生訪問衝突
2.原因分析
m_tipWidgetOpacity 是new的類變量,m_widgetTipsShadowEffect ,第一次設置m_tipWidgetOpacity ,第二次設置m_widgetTipsShadowEffect ,此時Qt會自動刪除第一次設置的m_tipWidgetOpacity ,
//設置透明度效果
m_tipWidgetOpacity = new QGraphicsOpacityEffect(ui.widgetTips);
m_tipWidgetOpacity->setOpacity(1);
ui.widgetTips->setGraphicsEffect(m_tipWidgetOpacity);
//在設置陰影效果
m_widgetTipsShadowEffect = new QGraphicsDropShadowEffect(this);
m_widgetTipsShadowEffect->setOffset(0, 4); //陰影的偏移量
m_widgetTipsShadowEffect->setColor(QColor(0, 0, 0,0.08*255)); //陰影的顏色
m_widgetTipsShadowEffect->setBlurRadius(24); // 陰影圓角的大小
ui.widgetTips->setGraphicsEffect(m_widgetTipsShadowEffect);//自動銷燬deletem_tipWidgetOpacity
//在設置透明度效果
ui.widgetTips->setGraphicsEffect(m_tipWidgetOpacity);
m_tipWidgetOpacity->setOpacity(1);//此處崩潰,是因爲使用了delete後的空指針,內存空間已經被銷燬。
3.解決辦法
每次切換之前重新new一個變量,然後再設置進去。