On Thursday 22 February 2007 17:10, Giovanni Bajo wrote:
> On 2/22/2007 5:32 PM, Paul Giannaros wrote:
> >>> I have a class A that i'm wrapping with SIP. The class inherits from a
> >>> bunch of other classes. One of the classes it inherits from also in
> >>> turn inherits from QWidget. When I import the created module, whenever
> >>> I call a method that is meant to return an instance of class A I get a
> >>> QWidget instead. I can use sip.cast to get the QWidget back to an A
> >>> instance, but that's not a very friendly solution.
> >>> Can someone suggest why this is happening, or how to fix it?
> >>
> >> SIP needs to know the correct run-time type of your class: otherwise
> >> when it receives a QWidget* it cannot know what type the class really
> >> is.
> >>
> >> Have a look at how %ConvertToSubClassCode is implemented in
> >> QtCore/qobject.sip and QtGui/qapplication.sip (assuming you're using
> >> Qt4). Within your a.sip, you must add your own %ConvertToSubClassCode
> >> that verifies if a generic QObject* is an instance of your type (class
> >> A). SIP then knows how to "chain" all the other %ConvertToSubClassCode
> >> in the object hierarchy, so your code needs only to verify your own
> >> class.
> >
> > But I don't see why it's receiving a QWidget* -- the return type of the
> > functions i'm calling are explicitly A*.
>
> Because elsewhere, in a point of your code that you are probably
> ignoring, the instance is being returned as QWidget*. SIP executes the
> %ConvertToSubClassCode *once* and create a Python object of type
> QWidget; it register this Python an object within a hash table. After
> that, every time the instance is returned by *any* method, it's looked
> up in the hash table, and the Python wrapper (already constructed) is
> found.
>
> > Nevertheless, I implemented %ConvertToSubClassCode in class A (and class
> > B which inherits QWidget) using
> > sipMapStringToClass/sipStringTypeClassMap, and a QWidget is still being
> > returned.
>
> Can you show us this code please?

Sure, attached.
%Module kateinterface 0

%Import qt/qtmod.sip
// %Import kdeui/kdeuimod.sip

%Import ../ktexteditor/ktexteditor.sip



namespace Kate {


class View : KTextEditor::ClipboardInterface, KTextEditor::PopupMenuInterface, KTextEditor::ViewCursorInterface, KTextEditor::CodeCompletionInterface, KTextEditor::DynWordWrapInterface, KTextEditor::View {

%TypeHeaderCode
#include "ktexteditor/view.h"
#include "kate/view.h"
%End
    
    public:


%ConvertToSubClassCode
    static sipStringTypeClassMap map[] = {
        {sipName_Application, &sipClass_Kate_Application},
        {sipName_Document, &sipClass_Kate_Document},
        {sipName_DocumentManager, &sipClass_Kate_DocumentManager},
        {sipName_MainWindow, &sipClass_Kate_MainWindow},
        {sipName_Plugin, &sipClass_Kate_Plugin},
        {sipName_PluginConfigInterface, &sipClass_Kate_PluginConfigInterface},
        {sipName_PluginConfigPage, &sipClass_Kate_PluginConfigPage},
        {sipName_PluginManager, &sipClass_Kate_PluginManager},
        {sipName_ToolViewManager, &sipClass_Kate_ToolViewManager},
        {sipName_ViewManager, &sipClass_Kate_ViewManager},
    };
    
    printf("Test\n");
    
    sipClass = sipMapStringToClass(sipCpp->className(), map, sizeof(map) / sizeof(map[0]));
%End

        enum saveResult {
            SAVE_OK, SAVE_CANCEL, SAVE_RETRY, SAVE_ERROR 
        };
        
//         View();
//         virtual ~View();
        virtual bool isOverwriteMode() const;
        virtual void setOverwriteMode(bool);
        virtual QString currentTextLine();
        virtual QString currentWord();
        virtual QString word(int, int);
        virtual void insertText(const QString &mark);
        virtual bool canDiscard();
        virtual int tabWidth() = 0;
        virtual void setTabWidth(int) = 0;
        virtual void setEncoding(QString e) = 0;
        virtual bool isLastView()=0;
        virtual void readSessionConfig(KConfig *);
        virtual void writeSessionConfig(KConfig *);
        virtual bool iconBorder();
        virtual bool lineNumbersOn();
        virtual Kate::Document* getDoc();
        virtual void setActive(bool b) = 0;
        virtual bool isActive() = 0;

    public slots:
        virtual saveResult save();
        virtual saveResult saveAs();
        virtual void   flush();
        virtual void   indent();
        virtual void   unIndent();
        virtual void   cleanIndent();
        virtual void   comment();
        virtual void   uncomment();
        virtual void   keyReturn();
        virtual void   keyDelete();
        virtual void   backspace();
        virtual void   killLine();
        virtual void   cursorLeft();
        virtual void   shiftCursorLeft();
        virtual void   cursorRight();
        virtual void   shiftCursorRight();
        virtual void   wordLeft();
        virtual void   shiftWordLeft();
        virtual void   wordRight();
        virtual void   shiftWordRight();
        virtual void   home();
        virtual void   shiftHome();
        virtual void   end();
        virtual void   shiftEnd();
        virtual void   up();
        virtual void   shiftUp();
        virtual void   down();
        virtual void   shiftDown();
        virtual void   scrollUp();
        virtual void   scrollDown();
        virtual void   topOfView();
        virtual void   bottomOfView();
        virtual void   pageUp();
        virtual void   shiftPageUp();
        virtual void   pageDown();
        virtual void   shiftPageDown();
        virtual void   top();
        virtual void   shiftTop();
        virtual void   bottom();
        virtual void   shiftBottom();
        virtual void   find();
        virtual void   replace();
        virtual void   gotoLine();
        virtual int    getEol();
        virtual void   setEol(int);
        virtual void   setFocus();
        virtual void   findAgain(bool forward);
        virtual void   findAgain();
        virtual void   findPrev();
        virtual void   slotEditCommand();
        virtual void   setIconBorder(bool enable);
        virtual void   toggleIconBorder();
        virtual void   setLineNumbersOn(bool enable);
        virtual void   toggleLineNumbersOn();
        virtual void   slotIncFontSizes();
        virtual void   slotDecFontSizes();
        virtual void   gotoMark(KTextEditor::Mark *mark)=0;
        virtual void   toggleBookmark();
        virtual void   gotoLineNumber(int)=0;
    
    private:
        View();
};

class PluginConfigInterface {
%TypeHeaderCode
#include "kate/pluginconfiginterface.h"
%End

    public:
        PluginConfigInterface();
        virtual ~PluginConfigInterface();
        unsigned int pluginConfigInterfaceNumber();
        virtual void readConfig() = 0;
        virtual void writeConfig() = 0;
    
};


class PluginConfigPage : QWidget {
%TypeHeaderCode
#include "kate/pluginconfiginterfaceextension.h"
%End

    public:
        PluginConfigPage(QWidget *parent=0, const char *name=0);
        virtual ~PluginConfigPage();
        virtual void apply() = 0;
        virtual void reset() = 0;
        virtual void defaults() = 0;
    
    signals:
        void changed();
};

/// ----------------------


class Application : QObject {
%TypeHeaderCode
#include "kate/application.h"
%End
    public:
        uint mainWindows();
        Kate::MainWindow* activeMainWindow();
        Kate::MainWindow* mainWindow(uint n=0);
        Kate::DocumentManager* documentManager();
        Kate::PluginManager *pluginManager();
    private:
        Application();
    public:
};


class ToolViewManager : QObject {
%TypeHeaderCode
#include "kate/toolviewmanager.h"
%End
    public:
        enum Position {
            Left,
            Right,
            Top,
            Bottom
        };
        QWidget *createToolView(const QString &identifier, Kate::ToolViewManager::Position pos, const QPixmap &icon, const QString &text);
        
        bool moveToolView(QWidget *widget, Kate::ToolViewManager::Position pos);
        bool showToolView(QWidget *widget);
        bool hideToolView(QWidget *widget);
    
    private:
        ToolViewManager();
};


class ViewManager : QObject {
%TypeHeaderCode
#include "kate/viewmanager.h"
%End
    public slots:
        Kate::View *activeView();
        void activateView(uint documentNumber);
        void openURL(const KURL &url);
    
    signals:
        void viewChanged();
        
    private:
        ViewManager();
};


class DocumentManager : QObject {
%TypeHeaderCode
#include "kate/documentmanager.h"
%End

    public slots:
        Kate::Document* activeDocument();
        Kate::Document* document(uint n=0);
        Kate::Document* documentWithID(uint id=0);
        void openURL(const KURL &url, const QString &encoding=QString::null);
        int findDocument(const KURL &url);
        bool isOpen(const KURL &url);
        uint documents();
        bool closeDocument(Kate::Document* document);
        bool closeDocument(uint n=0);
        bool closeDocumentWithID(uint id);
        bool closeAllDocuments();
    
    signals:
        void documentChanged();
        void documentCreated(Kate::Document* document);
        void documentDeleted(uint documentNumber);
        
    private:
        DocumentManager();
};


class MainWindow : QObject {
%TypeHeaderCode
#include "kate/mainwindow.h"
%End
    public:
        KXMLGUIFactory *guiFactory() const;
        QWidget *centralWidget() const;
        Kate::ToolViewManager *toolViewManager();
    
    public slots:
        Kate::ViewManager *viewManager();
    
    private:
        MainWindow();
};


class Plugin : QObject {
%TypeHeaderCode
#include "kate/plugin.h"
%End
    public:
        Plugin(Kate::Application *application, const char *name=0);
        ~Plugin();
        uint pluginNumber() const;
        Kate::Application *application();
};


class PluginManager : QObject {
%TypeHeaderCode
#include "kate/pluginmanager.h"
%End
    public:
        Kate::Plugin *plugin(const QString &name);
        bool pluginAvailable(const QString &name);
        Kate::Plugin *loadPlugin(const QString &name, bool permanent=true);
        void unloadPlugin(const QString &name, bool permanent=true);
    private:
        PluginManager();
};


// Despite what the ruddy documentation says, this inherits from a LOT of stuff.
class Document : KTextEditor::Document, KTextEditor::EditInterface, KTextEditor::UndoInterface, KTextEditor::CursorInterface, KTextEditor::SelectionInterface, KTextEditor::SearchInterface, KTextEditor::HighlightingInterface, KTextEditor::BlockSelectionInterface, KTextEditor::ConfigInterface, KTextEditor::MarkInterface, KTextEditor::PrintInterface, KTextEditor::WordWrapInterface, KTextEditor::MarkInterfaceExtension, KTextEditor::SelectionInterfaceExt  {
%TypeHeaderCode
#include "ktexteditor/document.h"
#include "kate/document.h"
%End

    public:
        enum ConfigFlags { 
            cfAutoIndent = 0x1, cfBackspaceIndents = 0x2, cfWordWrap = 0x4, cfReplaceTabs = 0x8, cfRemoveSpaces = 0x10, cfWrapCursor = 0x20, cfAutoBrackets = 0x40, cfPersistent = 0x80, cfKeepSelection = 0x100, cfDelOnInput = 0x400, cfXorSelect = 0x800, cfOvr = 0x1000, cfMark = 0x2000, cfKeepIndentProfile = 0x8000, cfKeepExtraSpaces = 0x10000, cfTabIndents = 0x80000, cfShowTabs = 0x200000, cfSpaceIndent = 0x400000, cfSmartHome = 0x800000
        };
    
//         Document();
//         Document(QObject *parent, const char *name);
//         virtual ~Document();
        virtual void isModOnHD(bool x=false);
        virtual QString docName();
        virtual void setDocName(QString name);
        
//         virtual ActionMenu* hlActionMenu(const QString &, QObject* x=0, const char *y=0) = 0;
//         virtual ActionMenu
        virtual void setWordWrap(bool w) = 0;
        virtual bool wordWrap() = 0;
        virtual void setWordWrapAt(uint n) = 0;
        virtual uint wordWrapAt() = 0;
        virtual void setEncoding(const QString &encoding) = 0;
        virtual QString encoding() const = 0;
        // // ConfigPage stuff
        virtual uint configFlags() = 0;
        virtual void setConfigFlags(uint flags) = 0;
    
    public slots:
        virtual void flush();
        virtual void reloadFile() = 0;
        virtual void spellcheck();
        virtual void exportAs(const QString &) = 0;
        virtual void applyWordWrap() = 0;
    
    signals:
        void modifiedOnDisc(Kate::Document *document, bool isModified, unsigned char reason);
    
    private:
        Document();
};


Kate::Application* application();
// // Kate::DocumentManager* documentManager();


};

_______________________________________________
PyKDE mailing list    [email protected]
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to