[PyQt] loading arbitrary kparts

Jim Bublitz jbublitz at nwinternet.com
Tue Oct 9 01:21:13 BST 2007


On Monday 08 October 2007 16:16, Marcos Dione wrote:

Running this:

from kdecore import *
from kio import *
from kparts import *
import sys

KCmdLineArgs.init (sys.argv, sys.argv[0], "testmime", "", "")
args= KCmdLineArgs.parsedArgs ()
app= KApplication ()
#app.exec_loop ()

for u in ('http://api.kde.org/3.5-api/kdelibs-apidocs/kde_gear_64.png', 
'http://jbailey.livejournal.com/41057.html'):
    url = KURL (u)
#    mime = KMimeType.findByURL(url, 0, False, False)
#    mimeType= mime.name ()
#    if mimeType=='application/octet-stream':
#        print "trying harder"
    mimeType= KIO.NetAccess.mimetype (url, None)
    print mimeType

I get:

jim at jim:~/Documents> python testMime.py
image/png
text/html

Changing it to this:

for u in ('http://api.kde.org/3.5-api/kdelibs-apidocs/kde_gear_64.png', 
'http://jbailey.livejournal.com/41057.html'):
    url = KURL (u)
    mime = KMimeType.findByURL(url, 0, False, False)
    mimeType= mime.name ()
#    if mimeType=='application/octet-stream':
#        print "trying harder"
#    mimeType= KIO.NetAccess.mimetype (url, None)
    print mimeType

I get:

jim at jim:~/Documents> python testMime.py
application/octet-stream
application/octet-stream

because (from the KDE API docs):

"This function looks at mode_t first. If that does not help it looks at the 
extension. This is fine for FTP, FILE, TAR and friends, but is not for HTTP 
( cgi scripts! ). You should use KRun instead, but this function returns 
immediately while KRun is async. If no extension matches, then
****  the file will be examined if the URL is a local file or  ****
****    "application/octet-stream" is returned otherwise.    **** "

So PyKDE appears to be working correctly here. What version of PyKDE are you 
using? Shouldn't make a difference, but if an older version you could try 
upgrading.

> > You could also try to use KRun, just as a *test* to see if it will pick
> > up the mime type correctly (it launches an application though - doesn't
> > load a part).
>
>     will try.
>
> > >     but I can't find the ComponentFactory namespace in pykde, and I'm
> > > not sure it would fix my problem. so, what am I missing?
> >
> > ComponentFactory consists of only templates, so there isn't any code to
> > wrap, unless the templates are instantiated via a typedef somewhere else
> > in kdelibs. KParts.Factory is implemented though.
>
>     I didn't get this whole. can you explain a little more?

In C++, template types (classes or functions) only cause code to be generated 
when they're used - in a typedef or when instantiated. If no code references 
the template, then the template doesn't produce any code in the library or 
application.

componentfactory.h doesn't contain anything except templates, and if nothing 
else in the KParts module references those templates, they don't produce any 
code.

PyKDE (PyQt/sip) works by providing an interface to code in .so libs. If no 
binary code is there for a template type (and in this case there isn't any 
code), there isn't anything to interface to, so it isn't possible to use 
anything from componentfactory.h in PyKDE - there's no 'there' there.

Jim


More information about the PyQt mailing list