我正在尝试运行以下PySide Qt Python示例(代码位于此问题的底部):
https://github.com/Deusdies/pythonbo/blob/master/06-sixthTutorial-moresignals.py
我收到错误声明:
ASSERT:文件中的“pyMethod” /tmp/pyside-gUBW/pyside-qt4.8+1.1.2/libpyside/signalmanager.cpp,line 444
任何想法为什么会发生这种情况,我正在使用Mac OS X 10.8.3完全按原样运行代码。我有通过HomeBrew安装Python 2.7.4,以及qt和pyside。
任何帮助将不胜感激!
import sys
from PySide.QtCore import *
from PySide.QtGui import *
class ZeroSpinBox(QSpinBox):
zeros = 0
def __init__(self, parent=None):
super(ZeroSpinBox, self).__init__(parent)
self.connect(self, SIGNAL("valueChanged(int)"), self.checkzero)
def checkzero(self):
if not self.value():
self.zeros += 1
self.nulls = 5
self.emit(SIGNAL("atZero"), self.zeros, self.nulls)
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
dial = QDial()
dial.setNotchesVisible(True)
zeroSpinBox = ZeroSpinBox()
layout = QHBoxLayout()
layout.addWidget(dial)
layout.addWidget(zeroSpinBox)
self.setLayout(layout)
self.connect(dial, SIGNAL("valueChanged(int)"), zeroSpinBox.setValue)
self.connect(zeroSpinBox, SIGNAL("valueChanged(int)"), dial.setValue)
self.connect(zeroSpinBox, SIGNAL("atZero"), self.announce)
self.setWindowTitle("Signals and Slots")
def announce(self, zeros, nulls):
print "Announcing!!!"
app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
signalmanager.cpp
我设法在网上找到了一个包含违规signalmanager.cpp源文件的存储库:
https://github.com/jasonmccampbell/PySide/blob/master/libpyside/signalmanager.cpp#L444
以下是第444行的摘录:
int SignalManager::callPythonMetaMethod(const QMetaMethod& method, void** args, PyObject* pyMethod, bool isShortCuit)
{
Q_ASSERT(pyMethod); // This is the line causing the exception?
Shiboken::GilState gil;
PyObject* pyArguments = 0;
答案 0 :(得分:1)
http://qt-project.org/wiki/Signals_and_Slots_in_PySide
http://zetcode.com/tutorials/pyqt4/eventsandsignals/
PySide (or PyQt) signals and slots basics
http://qt-project.org/doc/qt-4.8/signalsandslots.html
我希望其中一些链接可以为您提供一些想法。 pyqt解析器可能正在努力链接你的信号和插槽,所以它抱怨。
通过在代码中添加一些print语句,将问题隔离到单行代码(可能是connect
调用之一)。然后简化你正在做的事情,然后建立你想做的事情。
希望有所帮助。
答案 1 :(得分:0)
我在
观看相应的YouTube视频后找到了解决方法http://www.youtube.com/watch?v=ooEzOyBiOLo。
视频确实非常清楚地解释了这次崩溃,我只是在不看视频的情况下尝试这个例子。
要修复信号必须定义为“atzero(int,int)”,否则应用程序将无法正常工作。