Plasma crashing with QGraphicsLinearLayout.addStretch

Johannes Wolter j at inutil.org
Wed May 6 20:39:26 CEST 2009


Hello,

I just got started with a simple Python-based Plasma widget. Right now I'm getting segfaults I cannot explain; so maybe someone could give me a hint, whether this is really a bug or a my fault.

I roughly followed an howto from techbase and everything works fine until I call "addStretch" on a QGraphicsLinearLayout instance. Then I'm getting a segfault with the following backtrace:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb3db9720 (LWP 11622)]
0xb741e737 in QGraphicsLayoutItem::isLayout () from /usr/lib/libQtGui.so.4
(gdb) bt
#0  0xb741e737 in QGraphicsLayoutItem::isLayout () from /usr/lib/libQtGui.so.4
#1  0xa85debf1 in ?? () from /usr/lib/pymodules/python2.5/PyQt4/QtGui.so
#2  0xa8b60bdd in PyCFunction_Call (func=0xa7078a6c, arg=0xa772a48c, kw=0x0) at ../Objects/methodobject.c:73
#3  0xa8bb2f09 in PyEval_EvalFrameEx (f=0x846620c, throwflag=0) at ../Python/ceval.c:3612
#4  0xa8bb3e3f in PyEval_EvalFrameEx (f=0x84012cc, throwflag=0) at ../Python/ceval.c:3698
#5  0xa8bb488d in PyEval_EvalCodeEx (co=0xa8a8f800, globals=0xa8a9e3e4, locals=0x0, args=0xa772a738, argcount=1, kws=0x0, kwcount=0, defs=0x0, defcount=0, closure=0x0)
    at ../Python/ceval.c:2875
#6  0xa8b4b5fa in function_call (func=0xa7fd5bc4, arg=0xa772a72c, kw=0x0) at ../Objects/funcobject.c:517
#7  0xa8b27a47 in PyObject_Call (func=0x0, arg=0xa772a72c, kw=0x0) at ../Objects/abstract.c:1861
#8  0xa8b2f875 in instancemethod_call (func=0xa7fd5bc4, arg=0xa772a72c, kw=0x0) at ../Objects/classobject.c:2519
#9  0xa8b27a47 in PyObject_Call (func=0x0, arg=0xa8ac502c, kw=0x0) at ../Objects/abstract.c:1861
#10 0xa8bacb8c in PyEval_CallObjectWithKeywords (func=0xa772966c, arg=0xa8ac502c, kw=0x0) at ../Python/ceval.c:3481
#11 0xb3b2e883 in ?? () from /usr/lib/python2.5/site-packages/sip.so
#12 0xa772966c in ?? ()
#13 0xa8ac502c in ?? ()
#14 0x00000000 in ?? ()

And here is the actual code.

class LosungApplet(plasmascript.Applet):
    def __init__(self,parent,args=None):
        plasmascript.Applet.__init__(self,parent)
    @pyqtSignature("strLinkClicked(const QString &)")
    def strLinkClicked(self, url):
        self.linkClicked(QUrl(url))
    @pyqtSignature("linkClicked(const QUrl &)")
    def linkClicked(self, url):
        #webbrowser.open(url.toString(), new=2)
        kio.KRun.runUrl(kdecore.KUrl(url), "text/html", None)
    def _setupWebView(self, losung):
        webView = Plasma.WebView(self.applet)
        webView.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
        QObject.connect(webView.page(), SIGNAL("linkClicked( const QUrl & )"), self.linkClicked)
        r = LosungenRenderer()
        webView.setHtml(r.renderLosung(losung))
        return webView
    def _setupLabel(self, losung):
        label = Plasma.Label()
        nw = label.nativeWidget()
        nw.setTextInteractionFlags(Qt.TextBrowserInteraction)
        QObject.connect(label, SIGNAL("linkActivated( const QString & )"), self.strLinkClicked)
        r = LosungenRenderer()
        label.setText(r.renderLosung(losung))
        return label
    def init(self):
        self.setHasConfigurationInterface(True)
        self.setAspectRatioMode(Plasma.IgnoreAspectRatio) 

        self.losungenDB = LosungenDB("%s%s"%(self.package().path(), LOSUNGEN_CSV))

        self.theme = Plasma.Svg(self)
        self.theme.setImagePath("widgets/background")
        self.setBackgroundHints(Plasma.Applet.DefaultBackground)

        arrowLeftIcon = kdeui.KIcon("arrow-left")
        arrowRightIcon = kdeui.KIcon("arrow-right")
        goTodayIcon = kdeui.KIcon("go-jump-today")
        self.arrowLeft = Plasma.ToolButton()
        self.arrowLeft.nativeWidget().setIcon(arrowLeftIcon)
        self.arrowLeft.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.arrowRight = Plasma.ToolButton()
        self.arrowRight.nativeWidget().setIcon(arrowRightIcon)
        self.goToday = Plasma.ToolButton()
        self.goToday.nativeWidget().setIcon(goTodayIcon)

        losung = self.losungenDB.getLosung(datetime.date.today())
        self.contentWidget = self._setupLabel(losung)

        #self.layout = QGraphicsLinearLayout(Qt.Vertical, self.applet)
        
        buttons = QGraphicsLinearLayout(Qt.Horizontal, self.applet)
        buttons.addItem(self.arrowLeft)
        buttons.addStretch()
        buttons.addItem(self.goToday)
        buttons.addStretch()
        buttons.addItem(self.arrowRight)

        #self.layout.addItem(self.contentWidget)
        #self.layout.addItem(buttons)
        self.setLayout(buttons)
        self.resize(350,200)
    def paintInterface(self, painter, option, rect):
        pass

def CreateApplet(parent):
    return LosungApplet(parent)

Thanks a lot for any hints,
Johannes Wolter


More information about the Plasma-devel mailing list