// This is the SIP interface definition for QObject. // // Copyright (c) 2007 // Riverbank Computing Limited // // This file is part of PyQt. // // This copy of PyQt is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2, or (at your option) any later // version. // // PyQt is supplied in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more // details. // // You should have received a copy of the GNU General Public License along with // PyQt; see the file LICENSE. If not, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. %ExportedDoc QObject bool disconnect const QObject *receiver const char *member = 0 Not yet implemented. bool disconnect const char *signal = 0 const QObject *receiver = 0 const char *member = 0 Not yet implemented. static bool disconnect const QObject *sender const char *signal const QObject *receiver const char *member At the moment PyQt does not support the full behaviour of the corresponding Qt method. In particular, specifying None (ie. 0 in C++) for the signal and receiver parameters is not yet supported. %End %If (Qt_2_00 -) class QObject : Qt { %TypeHeaderCode #include #include %End public: QObject(QObject * /TransferThis/ = 0,const char * = 0); %ConvertToSubClassCode static struct class_graph { char *name; sipWrapperType **type; int yes, no; } graph[] = { {sipName_QWidget, &sipClass_QWidget, 25, 1}, #if QT_VERSION >= 0x030100 && defined(SIP_FEATURE_Qt_ASSISTANTCLIENT) {sipName_QAssistantClient, &sipClass_QAssistantClient, -1, 2}, #else {NULL, NULL, -1, 2}, #endif {sipName_QSessionManager, &sipClass_QSessionManager, -1, 3}, {sipName_QTranslator, &sipClass_QTranslator, -1, 4}, #if QT_VERSION >= 0x030000 {sipName_QProcess, &sipClass_QProcess, -1, 5}, #else {NULL, NULL, -1, 5}, #endif {sipName_QToolTipGroup, &sipClass_QToolTipGroup, -1, 6}, #if defined(SIP_FEATURE_Qt_FILEDIALOG) {sipName_QFileIconProvider, &sipClass_QFileIconProvider, -1, 7}, #else {NULL, NULL, -1, 7}, #endif #if QT_VERSION >= 220 && defined(SIP_FEATURE_Qt_ACTION) {sipName_QAction, &sipClass_QAction, 89, 8}, #else {NULL, NULL, -1, 8}, #endif #if QT_VERSION >= 0x030000 {sipName_QObjectCleanupHandler, &sipClass_QObjectCleanupHandler, -1, 9}, #else {NULL, NULL, -1, 9}, #endif {sipName_QTimer, &sipClass_QTimer, -1, 10}, {sipName_QLayout, &sipClass_QLayout, 90, 11}, #if QT_VERSION >= 210 && defined(SIP_FEATURE_Qt_NETWORKPROTOCOL) {sipName_QUrlOperator, &sipClass_QUrlOperator, -1, 12}, #else {NULL, NULL, -1, 12}, #endif {sipName_QStyleSheet, &sipClass_QStyleSheet, -1, 13}, {sipName_QValidator, &sipClass_QValidator, 94, 14}, #if QT_VERSION >= 210 && defined(SIP_FEATURE_Qt_NETWORKPROTOCOL) {sipName_QNetworkOperation, &sipClass_QNetworkOperation, -1, 15}, #else {NULL, NULL, -1, 15}, #endif {sipName_QAccel, &sipClass_QAccel, -1, 16}, #if QT_VERSION >= 0x030100 {sipName_QEventLoop, &sipClass_QEventLoop, -1, 17}, #else {NULL, NULL, -1, 17}, #endif #if QT_VERSION >= 210 && defined(SIP_FEATURE_Qt_NETWORKPROTOCOL) {sipName_QNetworkProtocol, &sipClass_QNetworkProtocol, -1, 18}, #else {NULL, NULL, -1, 18}, #endif #if QT_VERSION >= 220 && defined(SIP_FEATURE_Qt_SOUND) {sipName_QSound, &sipClass_QSound, -1, 19}, #else {NULL, NULL, -1, 19}, #endif {sipName_QApplication, &sipClass_QApplication, -1, 20}, {sipName_QDragObject, &sipClass_QDragObject, 97, 21}, {sipName_QSocketNotifier, &sipClass_QSocketNotifier, -1, 22}, {sipName_QStyle, &sipClass_QStyle, 103, 23}, {sipName_QSignalMapper, &sipClass_QSignalMapper, -1, 24}, #if defined(SIP_FEATURE_Qt_CLIPBOARD) {sipName_QClipboard, &sipClass_QClipboard, -1, -1}, #else {NULL, NULL, -1, -1}, #endif {sipName_QStatusBar, &sipClass_QStatusBar, -1, 26}, #if defined(SIP_FEATURE_Qt_SIZEGRIP) {sipName_QSizeGrip, &sipClass_QSizeGrip, -1, 27}, #else {NULL, NULL, -1, 27}, #endif {sipName_QTabWidget, &sipClass_QTabWidget, -1, 28}, #if QT_VERSION >= 0x030000 {sipName_QDateEdit, &sipClass_QDateEdit, -1, 29}, #else {NULL, NULL, -1, 29}, #endif {sipName_QMainWindow, &sipClass_QMainWindow, -1, 30}, #if QT_VERSION >= 0x030000 {sipName_QDateTimeEdit, &sipClass_QDateTimeEdit, -1, 31}, #else {NULL, NULL, -1, 31}, #endif #if QT_VERSION >= 0x030000 {sipName_QTimeEdit, &sipClass_QTimeEdit, -1, 32}, #else {NULL, NULL, -1, 32}, #endif {sipName_QFrame, &sipClass_QFrame, 46, 33}, {sipName_QScrollBar, &sipClass_QScrollBar, -1, 34}, #if QT_VERSION >= 220 && defined(SIP_FEATURE_Qt_DIAL) {sipName_QDial, &sipClass_QDial, -1, 35}, #else {NULL, NULL, -1, 35}, #endif {sipName_QButton, &sipClass_QButton, 75, 36}, {sipName_QTabBar, &sipClass_QTabBar, -1, 37}, {sipName_QDialog, &sipClass_QDialog, 79, 38}, {sipName_QComboBox, &sipClass_QComboBox, -1, 39}, {sipName_QHeader, &sipClass_QHeader, -1, 40}, #if QT_VERSION >= 0x030000 {sipName_QDockArea, &sipClass_QDockArea, -1, 41}, #else {NULL, NULL, -1, 41}, #endif #if QT_VERSION >= 0x030200 {sipName_QSplashScreen, &sipClass_QSplashScreen, -1, 42}, #else {NULL, NULL, -1, 42}, #endif {sipName_QSlider, &sipClass_QSlider, -1, 43}, {sipName_QSpinBox, &sipClass_QSpinBox, -1, 44}, #if QT_VERSION >= 210 && defined(SIP_FEATURE_Qt_WORKSPACE) {sipName_QWorkspace, &sipClass_QWorkspace, -1, 45}, #else {NULL, NULL, -1, 45}, #endif #if QT_VERSION >= 0x030000 {sipName_QDesktopWidget, &sipClass_QDesktopWidget, -1, -1}, #else {NULL, NULL, -1, -1}, #endif {sipName_QGrid, &sipClass_QGrid, -1, 47}, {sipName_QLineEdit, &sipClass_QLineEdit, -1, 48}, #if QT_VERSION >= 0x030200 {sipName_QToolBox, &sipClass_QToolBox, -1, 49}, #else {NULL, NULL, -1, 49}, #endif {sipName_QWidgetStack, &sipClass_QWidgetStack, -1, 50}, #if QT_VERSION >= 0x030000 {sipName_QDockWindow, &sipClass_QDockWindow, 60, 51}, #else {NULL, NULL, -1, 51}, #endif {sipName_QMenuBar, &sipClass_QMenuBar, -1, 52}, {sipName_QLabel, &sipClass_QLabel, -1, 53}, {sipName_QGroupBox, &sipClass_QGroupBox, 61, 54}, {sipName_QPopupMenu, &sipClass_QPopupMenu, -1, 55}, #if defined(SIP_FEATURE_Qt_SPLITTER) {sipName_QSplitter, &sipClass_QSplitter, -1, 56}, #else {NULL, NULL, -1, 56}, #endif {sipName_QProgressBar, &sipClass_QProgressBar, -1, 57}, {sipName_QScrollView, &sipClass_QScrollView, 66, 58}, {sipName_QHBox, &sipClass_QHBox, 74, 59}, {sipName_QLCDNumber, &sipClass_QLCDNumber, -1, -1}, {sipName_QToolBar, &sipClass_QToolBar, -1, -1}, {sipName_QButtonGroup, &sipClass_QButtonGroup, 64, 62}, {sipName_QHGroupBox, &sipClass_QHGroupBox, -1, 63}, {sipName_QVGroupBox, &sipClass_QVGroupBox, -1, -1}, {sipName_QVButtonGroup, &sipClass_QVButtonGroup, -1, 65}, {sipName_QHButtonGroup, &sipClass_QHButtonGroup, -1, -1}, #if QT_VERSION >= 210 && defined(SIP_FEATURE_Qt_ICONVIEW) {sipName_QIconView, &sipClass_QIconView, -1, 67}, #else {NULL, NULL, -1, 67}, #endif {sipName_QListView, &sipClass_QListView, -1, 68}, {sipName_QListBox, &sipClass_QListBox, -1, 69}, #if QT_VERSION >= 0x030000 {sipName_QGridView, &sipClass_QGridView, -1, 70}, #else {NULL, NULL, -1, 70}, #endif #if QT_VERSION >= 0x030000 {sipName_QTextEdit, &sipClass_QTextEdit, 71, -1}, #else {NULL, NULL, -1, -1}, #endif {sipName_QTextBrowser, &sipClass_QTextBrowser, -1, 72}, {sipName_QMultiLineEdit, &sipClass_QMultiLineEdit, -1, 73}, {sipName_QTextView, &sipClass_QTextView, -1, -1}, {sipName_QVBox, &sipClass_QVBox, -1, -1}, {sipName_QToolButton, &sipClass_QToolButton, -1, 76}, {sipName_QRadioButton, &sipClass_QRadioButton, -1, 77}, {sipName_QPushButton, &sipClass_QPushButton, -1, 78}, {sipName_QCheckBox, &sipClass_QCheckBox, -1, -1}, #if defined(WS_X11) && defined(SIP_FEATURE_Qt_PRINTDIALOG) {sipName_QPrintDialog, &sipClass_QPrintDialog, -1, 80}, #else {NULL, NULL, -1, 80}, #endif #if QT_VERSION >= 0x030000 {sipName_QErrorMessage, &sipClass_QErrorMessage, -1, 81}, #else {NULL, NULL, -1, 81}, #endif #if QT_VERSION >= 210 && defined(SIP_FEATURE_Qt_INPUTDIALOG) {sipName_QInputDialog, &sipClass_QInputDialog, -1, 82}, #else {NULL, NULL, -1, 82}, #endif #if defined(SIP_FEATURE_Qt_MESSAGEBOX) {sipName_QMessageBox, &sipClass_QMessageBox, -1, 83}, #else {NULL, NULL, -1, 83}, #endif #if defined(SIP_FEATURE_Qt_WIZARD) {sipName_QWizard, &sipClass_QWizard, -1, 84}, #else {NULL, NULL, -1, 84}, #endif #if defined(SIP_FEATURE_Qt_COLORDIALOG) {sipName_QColorDialog, &sipClass_QColorDialog, -1, 85}, #else {NULL, NULL, -1, 85}, #endif #if defined(SIP_FEATURE_Qt_FONTDIALOG) {sipName_QFontDialog, &sipClass_QFontDialog, -1, 86}, #else {NULL, NULL, -1, 86}, #endif #if defined(SIP_FEATURE_Qt_FILEDIALOG) {sipName_QFileDialog, &sipClass_QFileDialog, -1, 87}, #else {NULL, NULL, -1, 87}, #endif #if defined(SIP_FEATURE_Qt_PROGRESSDIALOG) {sipName_QProgressDialog, &sipClass_QProgressDialog, -1, 88}, #else {NULL, NULL, -1, 88}, #endif #if defined(SIP_FEATURE_Qt_TABDIALOG) {sipName_QTabDialog, &sipClass_QTabDialog, -1, -1}, #else {NULL, NULL, -1, -1}, #endif #if QT_VERSION >= 220 && defined(SIP_FEATURE_Qt_ACTION) {sipName_QActionGroup, &sipClass_QActionGroup, -1, -1}, #else {NULL, NULL, -1, -1}, #endif {sipName_QGridLayout, &sipClass_QGridLayout, -1, 91}, {sipName_QBoxLayout, &sipClass_QBoxLayout, 92, -1}, {sipName_QHBoxLayout, &sipClass_QHBoxLayout, -1, 93}, {sipName_QVBoxLayout, &sipClass_QVBoxLayout, -1, -1}, {sipName_QDoubleValidator, &sipClass_QDoubleValidator, -1, 95}, {sipName_QIntValidator, &sipClass_QIntValidator, -1, 96}, #if QT_VERSION >= 0x030000 {sipName_QRegExpValidator, &sipClass_QRegExpValidator, -1, -1}, #else {NULL, NULL, -1, -1}, #endif {sipName_QTextDrag, &sipClass_QTextDrag, -1, 98}, {sipName_QStoredDrag, &sipClass_QStoredDrag, 101, 99}, #if QT_VERSION >= 210 && defined(SIP_FEATURE_Qt_ICONVIEW) && defined(SIP_FEATURE_Qt_DRAGANDDROP) {sipName_QIconDrag, &sipClass_QIconDrag, -1, 100}, #else {NULL, NULL, -1, 100}, #endif {sipName_QImageDrag, &sipClass_QImageDrag, -1, -1}, #if QT_VERSION >= 210 {sipName_QColorDrag, &sipClass_QColorDrag, -1, 102}, #else {NULL, NULL, -1, 102}, #endif {sipName_QUriDrag, &sipClass_QUriDrag, -1, -1}, {sipName_QCommonStyle, &sipClass_QCommonStyle, 104, -1}, #if defined(SIP_FEATURE_Qt_STYLE_WINDOWS) {sipName_QWindowsStyle, &sipClass_QWindowsStyle, 106, 105}, #else {NULL, NULL, -1, 105}, #endif #if defined(SIP_FEATURE_Qt_STYLE_MOTIF) {sipName_QMotifStyle, &sipClass_QMotifStyle, 107, -1}, #else {NULL, NULL, -1, -1}, #endif #if defined(SIP_FEATURE_Qt_STYLE_PLATINUM) {sipName_QPlatinumStyle, &sipClass_QPlatinumStyle, -1, 110}, #else {NULL, NULL, -1, 110}, #endif #if defined(SIP_FEATURE_Qt_STYLE_CDE) {sipName_QCDEStyle, &sipClass_QCDEStyle, -1, 108}, #else {NULL, NULL, -1, 108}, #endif #if QT_VERSION >= 220 && defined(SIP_FEATURE_Qt_STYLE_MOTIFPLUS) {sipName_QMotifPlusStyle, &sipClass_QMotifPlusStyle, -1, 109}, #else {NULL, NULL, -1, 109}, #endif #if QT_VERSION >= 220 && defined(SIP_FEATURE_Qt_STYLE_SGI) {sipName_QSGIStyle, &sipClass_QSGIStyle, -1, -1}, #else {NULL, NULL, -1, -1}, #endif #if defined(PYQT_STYLE_WINDOWSXP) {sipName_QWindowsXPStyle, &sipClass_QWindowsXPStyle, -1, -1}, #else {NULL, NULL, -1, -1}, #endif }; int i = 0; sipClass = NULL; do { struct class_graph *cg = &graph[i]; if (cg->name != NULL && sipCpp->inherits(cg->name)) { sipClass = *cg->type; i = cg->yes; } else i = cg->no; } while (i >= 0); %End // This is really virtual. With the way we are implementing it doesn't // need to be and has the advantage that the C++ implementation can be // used in %ConvertToSubClassCode to get the C++ name for Python // sub-classes. However, it is also means that C++ plugins can't get // the true (Python) class name. SIP_PYOBJECT className() const; %MethodCode sipRes = sipClassName(sipSelf); %End %If (- Qt_3_0_0) static QString tr(const char *) /AutoGen=Qt_TRANSLATION/; %End %If (Qt_2_2_0 - Qt_2_3_1) // There was an apparent bug in moc prior to Qt v2.3.1 where this // method wasn't automatically generated. static QString tr(const char *,const char *); %End %If (Qt_2_3_1 - Qt_3_0_0) static QString tr(const char *,const char *) /AutoGen=Qt_TRANSLATION/; %End %If (Qt_3_0_0 -) // Note that tr() and trUtf8() are really static methods. We pretend // they aren't so that we can use self to get hold of the class name. // We could mimic moc's behaviour more accurately by creating tr() and // trUtf8() methods for a Python sub-class instance in the sub-class's // ctor. QString tr(const char *,const char * = 0); %MethodCode PyObject *nmobj; if ((nmobj = sipClassName(sipSelf)) == NULL) sipIsErr = 1; else { char *cname = PyString_AsString(nmobj); Py_BEGIN_ALLOW_THREADS if (cname && qApp) sipRes = new QString(qApp -> translate(cname,a0,a1,QApplication::DefaultCodec)); else sipRes = new QString(QString::fromLatin1(a0)); Py_END_ALLOW_THREADS Py_DECREF(nmobj); } %End QString trUtf8(const char *,const char * = 0); %MethodCode PyObject *nmobj; if ((nmobj = sipClassName(sipSelf)) == NULL) sipIsErr = 1; else { char *cname = PyString_AsString(nmobj); Py_BEGIN_ALLOW_THREADS if (cname && qApp) sipRes = new QString(qApp -> translate(cname,a0,a1,QApplication::UnicodeUTF8)); else sipRes = new QString(QString::fromUtf8(a0)); Py_END_ALLOW_THREADS Py_DECREF(nmobj); } %End %End virtual QMetaObject *metaObject() const /AutoGen/; virtual bool event(QEvent *); virtual bool eventFilter(QObject *,QEvent *); bool isA(const char *) const; %MethodCode // The Qt implementation doesn't know anything about Python // sub-classes. For SIP v4 we use the Python type's name. For // SIP v3 we use the broken Qt behaviour as it's deprecated and // we want to keep things simple. #if SIP_VERSION >= 0x040000 sipRes = (strcmp(sipSelf -> ob_type -> tp_name,a0) == 0); #else Py_BEGIN_ALLOW_THREADS sipRes = sipCpp -> QObject::isA(a0); Py_END_ALLOW_THREADS #endif %End bool inherits(const char *) const; %MethodCode // The Qt implementation doesn't know anything about Python // sub-classes. For SIP v4 we use the Python type's MRO. For // SIP v3 we use the broken Qt behaviour as it's deprecated and // we want to keep things simple. #if SIP_VERSION >= 0x040000 PyObject *mro = sipSelf -> ob_type -> tp_mro; sipRes = 0; for (int i = 0; i < PyTuple_GET_SIZE(mro); ++i) if (strcmp(((PyTypeObject *)PyTuple_GET_ITEM(mro,i)) -> tp_name,a0) == 0) { sipRes = 1; break; } #else Py_BEGIN_ALLOW_THREADS sipRes = sipCpp -> QObject::inherits(a0); Py_END_ALLOW_THREADS #endif %End %If (- Qt_3_0_0) QStringList superClasses(bool = 0) const; %End const char *name() const; const char *name(const char *) const; virtual void setName(const char *); bool isWidgetType() const; bool highPriority() const; bool signalsBlocked() const; void blockSignals(bool); int startTimer(int); void killTimer(int); void killTimers(); %If (- Qt_3_0_0) QObject *child(const char *,const char * = 0); %End %If (Qt_3_0_0 -) QObject *child(const char *,const char * = 0,bool = 1); %End const QObjectList *children() const; %If (Qt_2_1_0 -) static const QObjectList *objectTrees(); %End %If (- Qt_3_0_0) QObjectList *queryList(char * = 0,char * = 0,bool = 1,bool = 1); %End %If (Qt_3_0_0 -) QObjectList *queryList(char * = 0,char * = 0,bool = 1,bool = 1) const; %MethodCode // The Qt implementation doesn't know anything about Python // sub-classes. For SIP v4 we get all classes and then use the // Python type's MRO to weed out those we don't want. For SIP // v3 we use the broken Qt behaviour as it's deprecated and we // want to keep things simple. #if SIP_VERSION >= 0x040000 sipRes = sipCpp -> QObject::queryList(0, a1, a2, a3); if (a0 && sipRes) { QObject *o = sipRes -> first(); while (o) { bool remove = TRUE; PyObject *pyo = sipConvertFromInstance(o, sipClass_QObject, 0); if (pyo) { PyObject *mro = pyo -> ob_type -> tp_mro; for (int i = 0; i < PyTuple_GET_SIZE(mro); ++i) if (strcmp(((PyTypeObject *)PyTuple_GET_ITEM(mro,i)) -> tp_name,a0) == 0) { remove = FALSE; break; } Py_DECREF(pyo); } if (remove) { sipRes -> remove(); o = sipRes -> current(); } else o = sipRes -> next(); } } #else Py_BEGIN_ALLOW_THREADS sipRes = sipCpp -> QObject::queryList(a0, a1, a2, a3); Py_END_ALLOW_THREADS #endif %End %End virtual void insertChild(QObject * /Transfer/); virtual void removeChild(QObject * /TransferBack/); void installEventFilter(const QObject *); void removeEventFilter(const QObject *); static SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_QOBJECT,SIP_SLOT); %MethodCode sipRes = sipConnectRx(a0,a1,a2,a3,0); %End static SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_PYCALLABLE); %MethodCode sipRes = sipConnectRx(a0,a1,a2,0,0); %End SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_SLOT) const; %MethodCode sipRes = sipConnectRx(a0,a1,sipSelf,a2,0); %End static SIP_PYOBJECT disconnect(SIP_QOBJECT,SIP_SIGNAL,SIP_QOBJECT,SIP_SLOT); %MethodCode sipRes = sipDisconnectRx(a0,a1,a2,a3); %End static SIP_PYOBJECT disconnect(SIP_QOBJECT,SIP_SIGNAL,SIP_PYCALLABLE); %MethodCode sipRes = sipDisconnectRx(a0,a1,a2,0); %End // bool disconnect(const char * = 0,const QObject * = 0,const char * = 0); // bool disconnect(const QObject *,const char * = 0); void dumpObjectTree(); void dumpObjectInfo(); QObject *parent() const; void emit(SIP_SIGNAL,SIP_PYTUPLE); %MethodCode if (sipEmitSignal(sipSelf,a0,a1) < 0) sipIsErr = 1; %End %If (Qt_PROPERTIES) %If (Qt_2_1_0 - Qt_3_0_0) bool setProperty(const char *,const QVariant &); QVariant property(const char *) const; %End %If (Qt_3_0_0 -) virtual bool setProperty(const char *,const QVariant &); virtual QVariant property(const char *) const; %End %End signals: void destroyed(); %If (Qt_3_0_0 -) void destroyed(QObject *); %End public slots: %If (Qt_3_0_0 -) void deleteLater(); %End public: // This is actually protected, but we never need to call the real // method. SIP_PYOBJECT sender(); %MethodCode sipRes = sipGetSender(); %End protected: virtual void timerEvent(QTimerEvent *); virtual void childEvent(QChildEvent *); %If (Qt_3_0_0 -) virtual void customEvent(QCustomEvent *); %End private: QObject(const QObject &); }; SIP_PYOBJECT QT_TR_NOOP(SIP_PYOBJECT); %MethodCode Py_INCREF(a0); sipRes = a0; %End SIP_PYOBJECT QT_TRANSLATE_NOOP(SIP_PYOBJECT,SIP_PYOBJECT); %MethodCode Py_INCREF(a1); sipRes = a1; %End %End %If (- Qt_2_00) class QObject { %TypeHeaderCode #include %End public: QObject(QObject * /TransferThis/ = 0,const char * = 0); %ConvertToSubClassCode // The table of Python class objects indexed by their names. The table // must be sorted by name. static sipStringTypeClassMap map[] = { {sipName_QAccel, &sipClass_QAccel}, {sipName_QApplication, &sipClass_QApplication}, {sipName_QBoxLayout, &sipClass_QBoxLayout}, {sipName_QButton, &sipClass_QButton}, {sipName_QButtonGroup, &sipClass_QButtonGroup}, {sipName_QCheckBox, &sipClass_QCheckBox}, #if defined(SIP_FEATURE_Qt_CLIPBOARD) {sipName_QClipboard, &sipClass_QClipboard}, #endif {sipName_QComboBox, &sipClass_QComboBox}, {sipName_QDialog, &sipClass_QDialog}, {sipName_QDoubleValidator, &sipClass_QDoubleValidator}, {sipName_QDragObject, &sipClass_QDragObject}, #if defined(SIP_FEATURE_Qt_FILEDIALOG) {sipName_QFileDialog, &sipClass_QFileDialog}, {sipName_QFileIconProvider, &sipClass_QFileIconProvider}, #endif {sipName_QFrame, &sipClass_QFrame}, {sipName_QGridLayout, &sipClass_QGridLayout}, {sipName_QGroupBox, &sipClass_QGroupBox}, {sipName_QHBoxLayout, &sipClass_QHBoxLayout}, {sipName_QHeader, &sipClass_QHeader}, {sipName_QImageDrag, &sipClass_QImageDrag}, {sipName_QIntValidator, &sipClass_QIntValidator}, {sipName_QLCDNumber, &sipClass_QLCDNumber}, {sipName_QLabel, &sipClass_QLabel}, {sipName_QLayout, &sipClass_QLayout}, {sipName_QLineEdit, &sipClass_QLineEdit}, {sipName_QListBox, &sipClass_QListBox}, {sipName_QListView, &sipClass_QListView}, {sipName_QMainWindow, &sipClass_QMainWindow}, {sipName_QMenuBar, &sipClass_QMenuBar}, #if defined(SIP_FEATURE_Qt_MESSAGEBOX) {sipName_QMessageBox, &sipClass_QMessageBox}, #endif {sipName_QMultiLineEdit, &sipClass_QMultiLineEdit}, {sipName_QPopupMenu, &sipClass_QPopupMenu}, #if defined(WS_X11) && defined(SIP_FEATURE_Qt_PRINTDIALOG) {sipName_QPrintDialog, &sipClass_QPrintDialog}, #endif {sipName_QProgressBar, &sipClass_QProgressBar}, #if defined(SIP_FEATURE_Qt_PROGRESSDIALOG) {sipName_QProgressDialog, &sipClass_QProgressDialog}, #endif {sipName_QPushButton, &sipClass_QPushButton}, {sipName_QRadioButton, &sipClass_QRadioButton}, {sipName_QScrollBar, &sipClass_QScrollBar}, {sipName_QScrollView, &sipClass_QScrollView}, {sipName_QSlider, &sipClass_QSlider}, {sipName_QSocketNotifier, &sipClass_QSocketNotifier}, {sipName_QSpinBox, &sipClass_QSpinBox}, #if defined(SIP_FEATURE_Qt_SPLITTER) {sipName_QSplitter, &sipClass_QSplitter}, #endif {sipName_QStatusBar, &sipClass_QStatusBar}, {sipName_QStoredDrag, &sipClass_QStoredDrag}, {sipName_QTabBar, &sipClass_QTabBar}, {sipName_QTextDrag, &sipClass_QTextDrag}, {sipName_QTimer, &sipClass_QTimer}, {sipName_QToolBar, &sipClass_QToolBar}, {sipName_QToolButton, &sipClass_QToolButton}, {sipName_QToolTipGroup, &sipClass_QToolTipGroup}, {sipName_QVBoxLayout, &sipClass_QVBoxLayout}, {sipName_QValidator, &sipClass_QValidator}, {sipName_QWidget, &sipClass_QWidget}, {sipName_QWidgetStack, &sipClass_QWidgetStack} }; sipClass = sipMapStringToClass(sipCpp -> className(),map,sizeof (map)/sizeof (map[0])); %End static SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_QOBJECT,SIP_SLOT); %MethodCode sipRes = sipConnectRx(a0,a1,a2,a3,0); %End static SIP_PYOBJECT connect(SIP_QOBJECT,SIP_SIGNAL,SIP_PYCALLABLE); %MethodCode sipRes = sipConnectRx(a0,a1,a2,0,0); %End static SIP_PYOBJECT disconnect(SIP_QOBJECT,SIP_SIGNAL,SIP_QOBJECT,SIP_SLOT); %MethodCode sipRes = sipDisconnectRx(a0,a1,a2,a3); %End static SIP_PYOBJECT disconnect(SIP_QOBJECT,SIP_SIGNAL,SIP_PYCALLABLE); %MethodCode sipRes = sipDisconnectRx(a0,a1,a2,0); %End virtual bool event(QEvent *); virtual bool eventFilter(QObject *,QEvent *); const char *tr(const char *) const; virtual QMetaObject *metaObject() const /AutoGen/; // This is actually virtual. However, with the way we are implementing // it we can ignore it. SIP_PYOBJECT className() const; %MethodCode sipRes = sipClassName(sipSelf); %End bool isA(const char *) const; bool inherits(const char *) const; const char *name() const; const char *name(const char *) const; void setName(const char *); bool isWidgetType() const; bool highPriority() const; bool signalsBlocked() const; void blockSignals(bool); int startTimer(int); void killTimer(int); void killTimers(); const QObjectList *children() const; QObjectList *queryList(char * = 0,char * = 0,bool = 1,bool = 1); void insertChild(QObject * /Transfer/); void removeChild(QObject * /TransferBack/); void installEventFilter(const QObject *); void removeEventFilter(const QObject *); // bool connect(QObject *,const char *,const char *); // bool disconnect(const char * = 0,const QObject * = 0,const char * = 0); // bool disconnect(const QObject *,const char * = 0); void dumpObjectTree(); void dumpObjectInfo(); QObject *parent() const; void emit(SIP_SIGNAL,SIP_PYTUPLE); %MethodCode if (sipEmitSignal(sipSelf,a0,a1) < 0) sipIsErr = 1; %End signals: void destroyed(); public: // This is actually protected, but we never need to call the real // method. SIP_PYOBJECT sender(); %MethodCode sipRes = sipGetSender(); %End protected: virtual void timerEvent(QTimerEvent *); private: QObject(const QObject &); }; %End SIP_PYOBJECT SLOT(const char *); %MethodCode if (!a0) { PyErr_Format(PyExc_TypeError,"qt.SLOT() slot name cannot be None"); sipIsErr = 1; } else { int len = strlen(a0); if ((sipRes = PyString_FromStringAndSize(NULL,1 + len)) == NULL) sipIsErr = 1; else { char *dp = PyString_AS_STRING(sipRes); *dp++ = '1'; memcpy(dp,a0,len + 1); } } %End SIP_PYOBJECT SIGNAL(const char *); %MethodCode if (!a0) { PyErr_Format(PyExc_TypeError,"qt.SIGNAL() signal cannot be None"); sipIsErr = 1; } else { int len = strlen(a0); if ((sipRes = PyString_FromStringAndSize(NULL,1 + len)) == NULL) sipIsErr = 1; else { char *dp = PyString_AS_STRING(sipRes); *dp++ = '2'; memcpy(dp,a0,len + 1); } } %End SIP_PYOBJECT PYSIGNAL(const char *); %MethodCode if (!a0) { PyErr_Format(PyExc_TypeError,"qt.PYSIGNAL() signal cannot be None"); sipIsErr = 1; } else { int len = strlen(a0); if ((sipRes = PyString_FromStringAndSize(NULL,1 + len)) == NULL) sipIsErr = 1; else { char *dp = PyString_AS_STRING(sipRes); *dp++ = '9'; memcpy(dp,a0,len + 1); } } %End // This is Qt support code for SIP v4.4 and later. %ModuleCode #include #include #include #include #include // This class is used as a slot on behalf of connections to a Python callable. // It is derived from QObject but is not run through moc. Instead the normal // moc-generated methods are handwritten in order to implement a universal // slot. This requires some knowledge of the internal implementation of // signals and slots but it is likely that they will only change between major // Qt versions. class UniversalSlot : public QObject { public: UniversalSlot(QObject *qtx, sipSlotConnection *conn, const char **member); ~UniversalSlot(); virtual QMetaObject *metaObject() const { return staticMetaObject(); } virtual bool qt_invoke(int, QUObject *args); static QMetaObject *staticMetaObject(); static const QObject *lastSender; static UniversalSlot *unislots; UniversalSlot *nextus, *prevus; sipSlotConnection conn; private: static QMetaObject *metaObj; }; // Create a universal slot. Note that this will leak if there is no signal // transmitter (ie. no parent) - QTimer.singleShot() for example. UniversalSlot::UniversalSlot(QObject *qtx, sipSlotConnection *connection, const char **member) : QObject() { // Save the connection. conn = *connection; // Detect when the transmitter is destroyed. if (qtx) connect(qtx, SIGNAL(destroyed(QObject *)), SLOT(deleteLater())); // Return the slot to connect to. *member = SLOT(unislot()); // Add this one to the global list. nextus = unislots; if (nextus) nextus -> prevus = this; prevus = 0; unislots = this; } // Destroy a universal slot. UniversalSlot::~UniversalSlot() { sipFreeConnection(&conn); // Remove this one from the global list. if (nextus) nextus -> prevus = prevus; if (prevus) prevus -> nextus = nextus; else unislots = nextus; } QMetaObject *UniversalSlot::metaObj = 0; #if QT_VERSION >= 0x030100 static QMetaObjectCleanUp cleanUp_UniversalSlot("UniversalSlot", &UniversalSlot::staticMetaObject); #else static QMetaObjectCleanUp cleanUp_UniversalSlot; #endif const QObject *UniversalSlot::lastSender = 0; UniversalSlot *UniversalSlot::unislots = 0; QMetaObject *UniversalSlot::staticMetaObject() { if (metaObj) return metaObj; // Define a single slot that takes no arguments and so will accept any // connection. static const QUMethod slot = {"unislot", 0, 0}; static const QMetaData slot_tbl[] = { {"unislot()", &slot, QMetaData::Public} }; metaObj = QMetaObject::new_metaobject( "UniversalSlot", QObject::staticMetaObject(), slot_tbl, 1, 0, 0, #ifndef QT_NO_PROPERTIES 0, 0, 0, 0, #endif 0, 0); cleanUp_UniversalSlot.setMetaObject(metaObj); return metaObj; } bool UniversalSlot::qt_invoke(int id, QUObject *qargs) { if (id - staticMetaObject()->slotOffset() != 0) return QObject::qt_invoke(id, qargs); bool ok = TRUE; const sipSignature *psig = conn.sc_signature; QVariant *qv; // Save in case it is asked for later. lastSender = sender(); // If the sender was a QSignal then the single argument will be wrapped // in a QVariant instance. At the moment we handle int argument as // that is all that is needed by PyQt (and PyKDE). if (lastSender -> inherits("QSignal")) qv = &static_QUType_QVariant.get(qargs + 1); else qv = 0; #ifdef WITH_THREAD PyGILState_STATE state = PyGILState_Ensure(); #endif PyObject *argtup = PyTuple_New(psig->sg_nrargs); if (!argtup) ok = FALSE; else { for (int a = 0; a < psig->sg_nrargs; ++a) { PyObject *arg; ++qargs; switch (psig->sg_args[a].atype) { case char_sat: case schar_sat: case uchar_sat: arg = PyString_FromStringAndSize((char *)static_QUType_ptr.get(qargs), 1); break; case string_sat: case sstring_sat: case ustring_sat: arg = PyString_FromString((char *)static_QUType_ptr.get(qargs)); break; case short_sat: arg = PyInt_FromLong(*(short *)static_QUType_ptr.get(qargs)); break; case ushort_sat: arg = PyLong_FromUnsignedLong(*(unsigned short *)static_QUType_ptr.get(qargs)); break; case int_sat: if (qv) arg = PyInt_FromLong(qv -> asInt()); else arg = PyInt_FromLong(static_QUType_int.get(qargs)); break; case uint_sat: arg = PyLong_FromUnsignedLong(*(unsigned *)static_QUType_ptr.get(qargs)); break; case long_sat: arg = PyLong_FromLong(*(long *)static_QUType_ptr.get(qargs)); break; case ulong_sat: arg = PyLong_FromUnsignedLong(*(unsigned long *)static_QUType_ptr.get(qargs)); break; case longlong_sat: arg = PyLong_FromLongLong(*(PY_LONG_LONG *)static_QUType_ptr.get(qargs)); break; case ulonglong_sat: arg = PyLong_FromUnsignedLongLong(*(unsigned PY_LONG_LONG *)static_QUType_ptr.get(qargs)); break; case float_sat: arg = PyFloat_FromDouble(*(float *)static_QUType_ptr.get(qargs)); break; case double_sat: arg = PyFloat_FromDouble(static_QUType_double.get(qargs)); break; case enum_sat: arg = sipConvertFromNamedEnum(*(int *)static_QUType_ptr.get(qargs), psig->sg_args[a].u.et); break; case bool_sat: arg = PyInt_FromLong(static_QUType_bool.get(qargs)); break; case void_sat: arg = sipConvertFromVoidPtr((void *)static_QUType_ptr.get(qargs)); break; case class_sat: case classp_sat: arg = sipConvertFromInstance((void *)static_QUType_ptr.get(qargs),psig->sg_args[a].u.wt,0); break; case mtype_sat: case mtypep_sat: arg = sipConvertFromMappedType((void *)static_QUType_ptr.get(qargs),psig->sg_args[a].u.mt,0); break; case qvariant_sat: case qvariantp_sat: arg = sipConvertFromInstance((void *)&static_QUType_QVariant.get(qargs),sipClass_QVariant,0); break; case pyobject_sat: arg = (PyObject *)static_QUType_ptr.get(qargs); break; default: arg = Py_NotImplemented; Py_INCREF(Py_NotImplemented); } PyTuple_SET_ITEM(argtup, a, arg); } // Dispatch to the real slot. if (ok && sipEmitToSlot(&conn.sc_slot, argtup) < 0) ok = FALSE; Py_DECREF(argtup); } if (!ok) PyErr_Print(); #ifdef WITH_THREAD PyGILState_Release(state); #endif return ok; } // Declare explicit C linkage. extern "C" { static void *sipQtCreateUniversalSlot(sipWrapper *, sipSlotConnection *, const char **); static void sipQtDestroyUniversalSlot(void *); static void *sipQtFindSlot(void *, const char *, PyObject *, const char *, const char **); static int sipQtConnect(void *, const char *, void *, const char *, int); static int sipQtDisconnect(void *, const char *, void *, const char *); static int sipQtSignalsBlocked(void *); static const void *sipQtGetSender(); static void sipQtForgetSender(); static int sipQtSameSignalSlotName(const char *, const char *); static sipSlotConnection *sipQtFindConnection(void *, void **); } // Factory function to create a universal slot instance. Returns a pointer to // the instance or 0 if there was an error. static void *sipQtCreateUniversalSlot(sipWrapper *tx, sipSlotConnection *conn, const char **member) { QObject *qtx = 0; // See if the transmitter is a QObject in which case we will connect // to it's destroyed signal so that the universal slot can be destroyed // at the same time. (Note that we used to do this by making the // universal slot a child of the transmitter. This doesn't work as // expected because QWidget destroys its children before emitting the // destroyed signal.) if (tx && PyObject_TypeCheck(tx, (PyTypeObject *)sipClass_QObject)) qtx = reinterpret_cast(conn->sc_transmitter); return new UniversalSlot(qtx, conn, member); } // Dispose of a receiver that might be a universal slot. static void sipQtDestroyUniversalSlot(void *rx) { for (UniversalSlot *us = UniversalSlot::unislots; us; us = us->nextus) if (us == reinterpret_cast(rx)) { delete us; break; } } // Search for the universal slot connected to a particular Qt signal. static void *sipQtFindSlot(void *tx, const char *sig, PyObject *rxObj, const char *slot, const char **member) { for (UniversalSlot *us = UniversalSlot::unislots; us; us = us->nextus) if (sipSameConnection(&us->conn, tx, sig, rxObj, slot)) { *member = SLOT(unislot()); return us; } return 0; } // Connect a Qt signal to a Qt slot. static int sipQtConnect(void *tx, const char *sig, void *rx, const char *slot, int) { return QObject::connect(reinterpret_cast(tx), sig, reinterpret_cast(rx), slot); } // Disconnect a Qt signal from a Qt slot. static int sipQtDisconnect(void *tx, const char *sig, void *rx, const char *slot) { return QObject::disconnect(reinterpret_cast(tx), sig, reinterpret_cast(rx), slot); } // See if signals are currently blocked for a QObject. static int sipQtSignalsBlocked(void *qobj) { return reinterpret_cast(qobj)->signalsBlocked(); } // Get the last sender for QObject::sender(). static const void *sipQtGetSender() { return UniversalSlot::lastSender; } // Forget the last sender. static void sipQtForgetSender() { UniversalSlot::lastSender = 0; } // See if two signal or slot names are the same. static int sipQtSameSignalSlotName(const char *s1, const char *s2) { // moc formats signal names, so we should first convert the supplied // string to the same format before comparing them. Instead we just // compare them as they are, but ignoring all spaces - this will have // the same result. do { // Skip any spaces. while (*s1 == ' ') ++s1; while (*s2 == ' ') ++s2; if (*s1++ != *s2) return 0; } while (*s2++ != '\0'); return 1; } // Return the next connection for a particular transmitter. This will be // called with the GIL locked. static sipSlotConnection *sipQtFindConnection(void *tx, void **context) { UniversalSlot *us = *reinterpret_cast(context); if (!us) us = UniversalSlot::unislots; sipSlotConnection *conn = 0; while (us) { sipSlotConnection *this_conn = &us->conn; us = us->nextus; if (this_conn->sc_transmitter == tx) { conn = this_conn; break; } } *context = us; return conn; } %End