PyQt4退出时崩溃

3 投票
1 回答
524 浏览
提问于 2025-04-18 05:59

窗口会显示出来,但在退出时崩溃了。错误报告显示在QtGui4.dll里发生了一些错误。

我的环境是PyQt4.10.4(Qt4.8.5)32位版本,运行在Windows 7(64位)上。有没有什么线索或者建议可以帮我找出发生了什么?非常感谢。

如果去掉一个或多个控件,崩溃就不会发生。真奇怪……

settings_window.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>SettingWindow</class>
 <widget class="QWidget" name="SettingWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>465</width>
    <height>439</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>50</x>
     <y>350</y>
     <width>75</width>
     <height>23</height>
    </rect>
   </property>
   <property name="text">
    <string>Save</string>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton_2">
   <property name="geometry">
    <rect>
     <x>180</x>
     <y>350</y>
     <width>75</width>
     <height>23</height>
    </rect>
   </property>
   <property name="text">
    <string>Cancel</string>
   </property>
  </widget>
  <widget class="QLabel" name="label_8">
   <property name="geometry">
    <rect>
     <x>40</x>
     <y>170</y>
     <width>54</width>
     <height>12</height>
    </rect>
   </property>
   <property name="text">
    <string>label</string>
   </property>
  </widget>
  <widget class="QLineEdit" name="lineEdit_3">
   <property name="geometry">
    <rect>
     <x>110</x>
     <y>170</y>
     <width>113</width>
     <height>20</height>
    </rect>
   </property>
  </widget>
  <widget class="QLabel" name="label_9">
   <property name="geometry">
    <rect>
     <x>40</x>
     <y>230</y>
     <width>54</width>
     <height>12</height>
    </rect>
   </property>
   <property name="text">
    <string>TextLabel</string>
   </property>
  </widget>
  <widget class="QLineEdit" name="lineEdit_4">
   <property name="geometry">
    <rect>
     <x>120</x>
     <y>220</y>
     <width>113</width>
     <height>20</height>
    </rect>
   </property>
  </widget>
  <widget class="QCheckBox" name="checkBox_4">
   <property name="geometry">
    <rect>
     <x>140</x>
     <y>300</y>
     <width>71</width>
     <height>16</height>
    </rect>
   </property>
   <property name="text">
    <string>CheckBox</string>
   </property>
  </widget>
  <widget class="QLabel" name="label_11">
   <property name="geometry">
    <rect>
     <x>120</x>
     <y>190</y>
     <width>54</width>
     <height>12</height>
    </rect>
   </property>
   <property name="text">
    <string>TextLabel</string>
   </property>
  </widget>
  <widget class="QLabel" name="label_12">
   <property name="geometry">
    <rect>
     <x>130</x>
     <y>250</y>
     <width>54</width>
     <height>12</height>
    </rect>
   </property>
   <property name="text">
    <string>TextLabel</string>
   </property>
  </widget>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>40</x>
     <y>100</y>
     <width>56</width>
     <height>14</height>
    </rect>
   </property>
   <layout class="QFormLayout" name="formLayout_2">
    <property name="fieldGrowthPolicy">
     <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
    </property>
    <item row="0" column="0">
     <widget class="QLabel" name="label_2">
      <property name="text">
       <string>label</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QWidget" name="layoutWidget">
   <property name="geometry">
    <rect>
     <x>40</x>
     <y>20</y>
     <width>163</width>
     <height>40</height>
    </rect>
   </property>
   <layout class="QFormLayout" name="formLayout">
    <property name="fieldGrowthPolicy">
     <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
    </property>
    <item row="0" column="0">
     <widget class="QLabel" name="label">
      <property name="text">
       <string>label</string>
      </property>
     </widget>
    </item>
    <item row="0" column="1">
     <widget class="QCheckBox" name="checkBox">
      <property name="text">
       <string>checkbox</string>
      </property>
     </widget>
    </item>
    <item row="1" column="1">
     <widget class="QCheckBox" name="checkBox_2">
      <property name="text">
       <string>checkbox</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

settings_window.py

#-*- coding: utf-8 -*-

import sys
from PyQt4.QtGui import qApp, QDialog, QApplication
from ui_settings_window import Ui_SettingWindow

class SettingWindow(QDialog, Ui_SettingWindow):
    def __init__(self):
        super(SettingWindow, self).__init__()
        self.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = SettingWindow()
    window.show()
    sys.exit(app.exec_())

1 个回答

7

使用sip.setdestroyonexit(False)解决了我的问题。这是解决pyqt在退出时崩溃的终极方法。pyqt文档中提到:

当Python解释器退出时,PyQt4会默认调用它所拥有的所有包装实例的C++析构函数。这是以随机顺序发生的,因此可能会导致解释器崩溃。通过调用sip.setdestroyonexit()函数,可以禁用这种行为。

而PyQt5会自动调用sip.setdestroyonexit()。

另一个参考资料是这个帖子,pyqt的作者也提到了sip.setdestroyonexit()。

撰写回答