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