hi,
so I am still a newbie in PyQt/Qt and was playing around with QFrames
and QDialogs.
the purpose of the attached program is to show a QFrame XOR a QDialog
editing the same object via a QDoubleSpinBox. Frame and Dialog should
not be visible at the same time.
when switching between Frame and Dialog with certain speed a seg fault /
bus error is occurring on MacOS.
MacOS 10.5.7
Python 2.6 (stackless)
Qt 4.5 (2009.02)
PyQt 4.5 (stable)
SIP sip-4.8-snapshot-20090430
on windows this error is not occurring, therefore the Frame is not
disappearing correctly (it's removed from the layout and destroyed
afterwards)
Windows XP
Python 2.6.2 (stackless)
Qt 4.5.1
PyQt 4.5.1 (binary)
thanks for your help!
michael
#------------------------------------------------------------------------------
# standard library imports:
#
import time
import sys
import os
#------------------------------------------------------------------------------
# extension module imports:
#
from PyQt4 import QtCore, QtGui
#------------------------------------------------------------------------------
# constants:
#
QT_DIALOG = 'QT_DIALOG'
QT_FRAME = 'QT_FRAME'
#------------------------------------------------------------------------------
# helper functions:
#
def visualize(parent, obj, kind=QT_DIALOG):
if kind == QT_DIALOG:
widget = MyDialog(parent, obj)
elif kind == QT_FRAME:
widget = MyFrame(parent, obj)
else:
raise ValueError("Kind '%s' not supported." % kind)
return widget
#------------------------------------------------------------------------------
# classes:
#
class _Widget(object):
def __init__(self, obj):
layout = QtGui.QGridLayout()
value = obj.my_float
print value
widget = QtGui.QDoubleSpinBox(self)
widget.setValue(value)
layout.addWidget(widget, 0, 0)
shedule = lambda x,y: lambda z: self._setValue(x, y, z)
self.connect(widget,
QtCore.SIGNAL('valueChanged(double)'),
shedule(obj, 'my_float'))
layout.setAlignment(QtCore.Qt.AlignCenter|
QtCore.Qt.AlignVCenter)
self.setLayout(layout)
self.show()
def _setValue(self, obj, name, value):
setattr(obj, name, value)
print getattr(obj, name)
class MyFrame(QtGui.QFrame, _Widget):
def __init__(self, parent, obj):
QtGui.QFrame.__init__(self, parent)
_Widget.__init__(self, obj)
class MyDialog(QtGui.QDialog, _Widget):
def __init__(self, parent, obj):
QtGui.QDialog.__init__(self, parent)
_Widget.__init__(self, obj)
#------------------------------------------------------------------------------
# main:
#
if __name__ == "__main__":
class Test:
my_float = 23.1
class MainWindow(QtGui.QMainWindow):
def __init__(self, obj):
QtGui.QMainWindow.__init__(self)
self.setGeometry(0, 0, 600, 400)
self.setWindowTitle('Some test...')
frame = QtGui.QFrame(self)
self.setCentralWidget(frame)
self.obj = obj
self.frame_widget = None
self.dialog_widget = None
self.layout = QtGui.QVBoxLayout()
self.layout.setAlignment(QtCore.Qt.AlignTop)
widget = QtGui.QPushButton('Dialog Demo', self)
self.connect(widget, QtCore.SIGNAL('clicked()'), self._onShowDialog)
self.layout.addWidget(widget)
widget = QtGui.QPushButton('Frame Demo', self)
self.connect(widget, QtCore.SIGNAL('clicked()'), self._onShowFrame)
self.layout.addWidget(widget)
frame.setLayout(self.layout)
frame.show()
self.center()
self.show()
self.raise_()
def _onShowFrame(self):
if not self.dialog_widget is None:
self.dialog_widget.close()
self.dialog_widget = None
if self.frame_widget is None:
self.frame_widget = visualize(self,
self.obj,
QT_FRAME)
self.layout.addWidget(self.frame_widget)
self.update()
def _onShowDialog(self):
if not self.frame_widget is None:
self.layout.removeWidget(self.frame_widget)
self.frame_widget.destroy()
self.frame_widget = None
if self.dialog_widget is None:
self.dialog_widget = visualize(self,
self.obj,
QT_DIALOG)
self.connect(self.dialog_widget,
QtCore.SIGNAL('finished(int)'),
self._onDestroyed)
self.update()
def _onDestroyed(self, x):
print "moo"
self.dialog_widget.close()
self.dialog_widget = None
def center(self):
screen = QtGui.QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width()-size.width())/2,
(screen.height()-size.height())/2)
app = QtGui.QApplication(sys.argv)
main = MainWindow(Test())
main.raise_()
sys.exit(app.exec_())
_______________________________________________
PyQt mailing list [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt