在Pyside

时间:2015-08-21 20:13:42

标签: python python-3.x gdb pyside

当我尝试设置表中的项目时,我的Qtablewidget遇到了这个特殊问题,我也注意到当我没有设置值但是只要我添加了代码设置表中的值我得到错误,奇怪的是,当我点击设置表项及其值的按钮,然后显示窗口时,它打开很好,但当我关闭窗口和试图再次打开它应用程序崩溃我怀疑这种行为是因为一些小部件未正确删除但我不确定这里是我从核心转储文件的后跟踪与gdb得到的输出

#0  0x0000000000000041 in ?? ()
#1  0x00007fd8013972cf in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#2  0x00007fd8013973ec in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#3  0x00007fd8013974e9 in ?? () from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#4  0x00007fd8035dc168 in QObjectPrivate::deleteChildren() ()
   from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#5  0x00007fd800e82d47 in QWidget::~QWidget() ()
   from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#6  0x00007fd801f5f7d1 in ?? ()
   from /usr/lib/python3/dist-packages/PySide/QtGui.cpython-34m-x86_64-linux-gnu.so
#7  0x00007fd8035dc168 in QObjectPrivate::deleteChildren() ()
   from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#8  0x00007fd800e82d47 in QWidget::~QWidget() ()
   from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#9  0x00007fd802067331 in ?? ()
   from /usr/lib/python3/dist-packages/PySide/QtGui.cpython-34m-x86_64-linux-gnu.so
#10 0x00007fd8035dc168 in QObjectPrivate::deleteChildren() ()
   from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#11 0x00007fd800e82d47 in QWidget::~QWidget() ()
   from /usr/lib/x86_64-linux-gnu/libQtGui.so.4
#12 0x00007fd801d8efd1 in ?? ()

这是我认为错误的代码

            activity_level = [i.level for i in self.all_objects]
            for row, activity in enumerate(activity_level):
                activity = self.format_est_and_lst(activity)
                while len(activity[0]) < self.project_duration:
                    activity[0].append('0')
                for column, value in enumerate(activity[0]):
                    item = QtGui.QTableWidgetItem(str(value))
                    item.setFlags(QtCore.Qt.ItemIsEnabled)
                    self.resourcelevel.level_ui.estTable.setItem(row, column, item)

            for column, value in enumerate(self.result[0]):
                item = QtGui.QTableWidgetItem(str(value))
                item.setFlags(QtCore.Qt.ItemIsEnabled)
                row = len(activity_level)
                self.resourcelevel.level_ui.estTable.setItem(row, column, item)



            for row, activity in enumerate(activity_level):
                while len(activity[1]) < self.project_duration:
                    activity[1].append('0')
                for column, value in enumerate(activity[1]):
                    item = QtGui.QTableWidgetItem(str(value))
                    item.setFlags(QtCore.Qt.ItemIsEnabled)
                    self.resourcelevel.level_ui.lstTable.setItem(row, column, item)

            for column, value in enumerate(self.result[1]):
                item = QtGui.QTableWidgetItem(str(value))
                item.setFlags(QtCore.Qt.ItemIsEnabled)
                row = len(activity_level)
                self.resourcelevel.level_ui.lstTable.setItem(row, column, item)


            self.resourcelevel.show()

我还想问一下,调试segfault以获取除gdb之外的确切错误的正确方法是什么,因为gdb没有指出导致segfault错误的特定小部件行,也是正确的在表格中设置项目的方式?

1 个答案:

答案 0 :(得分:1)

从segfault获取更好信息的唯一方法是使用PySide的DEBUG版本,也可能使用Qt。这显然是可能的,但是,在我有限的经验中,很难:你必须从源代码构建两者。

如果没有这个,你最好的选择是将失败的代码删除到一个更小,更简单但仍然失败的例子。把它降到100行左右。那时你可能已经找到了自己的错误。但是,如果你还没有,它将足够小,可以像在三个应用程序中请求的那样在Stack Overflow上发布。

在这种情况下,当Qt代码回调已删除的Python对象时,可能会发生问题。例如,可能是QTableWidgetItem.data。当表的Qt模型与Python版本不同步时(例如行数错误),可能会发生这种情况。这意味着问题很可能不是代码立即触发segfault(您已经发布),而是在表格设置和更改时更早。