2012-07-02 02:14 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbqt/qtgui/qth/QBoxLayout.qth
* contrib/hbqt/qtgui/qth/QComboBox.qth
* contrib/hbqt/qtgui/qth/QDirModel.qth
* contrib/hbqt/qtgui/qth/QDockWidget.qth
* contrib/hbqt/qtgui/qth/QDrag.qth
* contrib/hbqt/qtgui/qth/QGraphicsScene.qth
* contrib/hbqt/qtgui/qth/QGridLayout.qth
* contrib/hbqt/qtgui/qth/QLayout.qth
* contrib/hbqt/qtgui/qth/QMainWindow.qth
* contrib/hbqt/qtgui/qth/QMenu.qth
* contrib/hbqt/qtgui/qth/QMenuBar.qth
* contrib/hbqt/qtgui/qth/QScrollArea.qth
* contrib/hbqt/qtgui/qth/QStandardItemModel.qth
* contrib/hbqt/qtgui/qth/QStatusBar.qth
* contrib/hbqt/qtgui/qth/QTabWidget.qth
* contrib/hbqt/qtgui/qth/QToolBar.qth
* contrib/hbqt/qtgui/qth/QTreeWidgetItem.qth
* contrib/hbqt/qtgui/qth/QWidget.qth
% Replaced: [*D=n*] => [*X=n*] except for
QTreeWidget/QListWidget/QTableWidget as per the change
in core engine where deletion of a Qt object is entirely
thought of on new grounds.
* contrib/hbqt/tests/demoqt.prg
! Optimizations and removal of redundant code.
* contrib/hbqt/qtcore/hbqt.h
* contrib/hbqt/qtcore/hbqt_bind.cpp
* contrib/hbqt/qtcore/hbqt_destroyer.cpp
* contrib/hbqt/qtcore/hbqt_destroyer.h
+ Overhauled: the Qt object destruction protocol.
This commit is the result of two weeks intensive debugging
spree. This commits now handles MT applications better
then before. This commit also covers the mem leaks evident
for certain widgets.
WARNING: regression is possible, please report.
This commit is contained in:
@@ -16,6 +16,45 @@
|
||||
The license applies to all entries newer than 2009-04-28.
|
||||
*/
|
||||
|
||||
2012-07-02 02:14 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
|
||||
* contrib/hbqt/qtgui/qth/QBoxLayout.qth
|
||||
* contrib/hbqt/qtgui/qth/QComboBox.qth
|
||||
* contrib/hbqt/qtgui/qth/QDirModel.qth
|
||||
* contrib/hbqt/qtgui/qth/QDockWidget.qth
|
||||
* contrib/hbqt/qtgui/qth/QDrag.qth
|
||||
* contrib/hbqt/qtgui/qth/QGraphicsScene.qth
|
||||
* contrib/hbqt/qtgui/qth/QGridLayout.qth
|
||||
* contrib/hbqt/qtgui/qth/QLayout.qth
|
||||
* contrib/hbqt/qtgui/qth/QMainWindow.qth
|
||||
* contrib/hbqt/qtgui/qth/QMenu.qth
|
||||
* contrib/hbqt/qtgui/qth/QMenuBar.qth
|
||||
* contrib/hbqt/qtgui/qth/QScrollArea.qth
|
||||
* contrib/hbqt/qtgui/qth/QStandardItemModel.qth
|
||||
* contrib/hbqt/qtgui/qth/QStatusBar.qth
|
||||
* contrib/hbqt/qtgui/qth/QTabWidget.qth
|
||||
* contrib/hbqt/qtgui/qth/QToolBar.qth
|
||||
* contrib/hbqt/qtgui/qth/QTreeWidgetItem.qth
|
||||
* contrib/hbqt/qtgui/qth/QWidget.qth
|
||||
% Replaced: [*D=n*] => [*X=n*] except for
|
||||
QTreeWidget/QListWidget/QTableWidget as per the change
|
||||
in core engine where deletion of a Qt object is entirely
|
||||
thought of on new grounds.
|
||||
|
||||
* contrib/hbqt/tests/demoqt.prg
|
||||
! Optimizations and removal of redundant code.
|
||||
|
||||
* contrib/hbqt/qtcore/hbqt.h
|
||||
* contrib/hbqt/qtcore/hbqt_bind.cpp
|
||||
* contrib/hbqt/qtcore/hbqt_destroyer.cpp
|
||||
* contrib/hbqt/qtcore/hbqt_destroyer.h
|
||||
+ Overhauled: the Qt object destruction protocol.
|
||||
This commit is the result of two weeks intensive debugging
|
||||
spree. This commits now handles MT applications better
|
||||
then before. This commit also covers the mem leaks evident
|
||||
for certain widgets.
|
||||
|
||||
WARNING: regression is possible, please report.
|
||||
|
||||
2012-07-01 00:42 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
|
||||
* contrib/hbqt/hbmk2_qt.hb
|
||||
+ Implemented: some missing functionality which seemed not
|
||||
|
||||
@@ -108,7 +108,7 @@ HB_EXPORT PHB_ITEM hbqt_bindGetHbObjectByQtObject( void * qtObject );
|
||||
HB_EXPORT void * hbqt_bindGetQtObject( PHB_ITEM pObject );
|
||||
HB_EXPORT void hbqt_bindSetOwner( void * qtObject, HB_BOOL fOwner );
|
||||
HB_EXPORT void hbqt_bindDestroyHbObject( PHB_ITEM pObject );
|
||||
HB_EXPORT void hbqt_bindDestroyQtObject( void * qtObject );
|
||||
HB_EXPORT void hbqt_bindDestroyQtObject( void * qtObject, QObject * obj );
|
||||
|
||||
HB_EXPORT void hbqt_bindAddChild( PHB_ITEM pObject, PHB_ITEM pChild );
|
||||
HB_EXPORT void hbqt_bindDelChild( PHB_ITEM pObject, PHB_ITEM pChild );
|
||||
|
||||
@@ -64,28 +64,6 @@
|
||||
#include "hbqt_hbqslots.h"
|
||||
#include "hbqt_hbqevents.h"
|
||||
|
||||
/* locks for MT mode, now just dummy definitions which checks
|
||||
* if all locks are correctly released.
|
||||
*
|
||||
* #define HBQT_BIND_LOCK do {
|
||||
* #define HBQT_BIND_UNLOCK } while( 0 );
|
||||
*/
|
||||
static HB_CRITICAL_NEW( s_qtMtx );
|
||||
#define HBQT_BIND_LOCK do { hb_threadEnterCriticalSection( &s_qtMtx );
|
||||
#define HBQT_BIND_UNLOCK hb_threadLeaveCriticalSection( &s_qtMtx ); } while( 0 );
|
||||
|
||||
void hbqt_bindDelSlots( PHB_ITEM pSenderObject );
|
||||
void hbqt_bindDelEvents( PHB_ITEM pSenderObject );
|
||||
int __hbqt_bindItemsInGlobalList();
|
||||
int hbqt_bindIsHbObject( PHB_ITEM pObject );
|
||||
|
||||
static PHB_DYNS s_dynsym_NEW = NULL;
|
||||
static PHB_DYNS s_dynsym___CHILDS = NULL;
|
||||
static PHB_DYNS s_dynsym___SLOTS = NULL;
|
||||
static PHB_DYNS s_dynsym_SETSLOTS = NULL;
|
||||
static PHB_DYNS s_dynsym___EVENTS = NULL;
|
||||
static PHB_DYNS s_dynsym_SETEVENTS = NULL;
|
||||
|
||||
typedef struct _HBQT_BIND
|
||||
{
|
||||
void * qtObject;
|
||||
@@ -101,18 +79,49 @@ HBQT_BIND, * PHBQT_BIND;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PHBQT_BIND s_hbqt_binds;
|
||||
PHBQT_BIND s_hbqt_binds;
|
||||
} HB_BIND_DATA, * PHB_BIND_DATA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int iThreadId;
|
||||
int iObjCreated;
|
||||
int iObjDestroyed;
|
||||
HBQDestroyer * pDestroyer;
|
||||
HBQSlots * pReceiverSlots;
|
||||
HBQEvents * pReceiverEvents;
|
||||
} HB_BIND_THREADDATA, * PHB_BIND_THREADDATA;
|
||||
|
||||
HB_FUNC_EXTERN( HB_THREADID );
|
||||
/* locks for MT mode, now just dummy definitions which checks
|
||||
* if all locks are correctly released.
|
||||
*
|
||||
* #define HBQT_BIND_LOCK do {
|
||||
* #define HBQT_BIND_UNLOCK } while( 0 );
|
||||
*/
|
||||
static HB_CRITICAL_NEW( s_qtMtx );
|
||||
#define HBQT_BIND_LOCK do { hb_threadEnterCriticalSection( &s_qtMtx );
|
||||
#define HBQT_BIND_UNLOCK hb_threadLeaveCriticalSection( &s_qtMtx ); } while( 0 );
|
||||
|
||||
static PHB_DYNS s_dynsym_NEW = NULL;
|
||||
static PHB_DYNS s_dynsym___CHILDS = NULL;
|
||||
static PHB_DYNS s_dynsym___SLOTS = NULL;
|
||||
static PHB_DYNS s_dynsym_SETSLOTS = NULL;
|
||||
static PHB_DYNS s_dynsym___EVENTS = NULL;
|
||||
static PHB_DYNS s_dynsym_SETEVENTS = NULL;
|
||||
|
||||
static PHB_BIND_DATA s_bindData = NULL;
|
||||
#define hbqt_bindGetData() ( ( ( PHB_BIND_DATA ) &s_bindData )->s_hbqt_binds )
|
||||
|
||||
void hbqt_bindDelSlots( PHB_ITEM pSenderObject );
|
||||
void hbqt_bindDelEvents( PHB_ITEM pSenderObject );
|
||||
int __hbqt_bindItemsInGlobalList();
|
||||
|
||||
static QList<PHB_ITEM> hbqt_bindGetObjectListByThread( int iThreadId );
|
||||
static void hbqt_bindRemoveBind( PHBQT_BIND bnd );
|
||||
static void hbqt_bindDestroyChildren( void * hbObject, bool fDeleteSelf );
|
||||
static QList<PHB_ITEM> hbqt_bindGetObjectListByThread( int iThreadId );
|
||||
static PHBQT_BIND hbqt_bindGetBindByQtObject( void * qtObject );
|
||||
static PHBQT_BIND hbqt_bindGetBindByHbObject( void * hbObject );
|
||||
|
||||
static int s_bind_threadId = 0;
|
||||
|
||||
@@ -124,93 +133,146 @@ static int hbqt_bindGetThreadId()
|
||||
return s_bind_threadId;
|
||||
}
|
||||
|
||||
#define __HBQT_WITH_MT_SUPPORT__NO
|
||||
#ifdef __HBQT_WITH_MT_SUPPORT__
|
||||
static void hbqt_bindInit( void * cargo )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindInit............0........." ) );
|
||||
( ( PHB_BIND_DATA ) cargo )->s_hbqt_binds = NULL;
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindInit............1........." ) );
|
||||
}
|
||||
static void hbqt_bindRelease( void * cargo )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindRelease.........0........." ) );
|
||||
PHBQT_BIND hbqt_bind;
|
||||
|
||||
while( ( ( PHB_BIND_DATA ) cargo )->s_hbqt_binds )
|
||||
{
|
||||
hbqt_bind = ( ( PHB_BIND_DATA ) cargo )->s_hbqt_binds;
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindRelease( %p, %s )", hbqt_bind->qtObject, hbqt_bind->szClassName ) );
|
||||
hbqt_bindDestroyHbObject( hb_arrayFromId( NULL, hbqt_bind->hbObject ) );
|
||||
}
|
||||
( ( PHB_BIND_DATA ) cargo )->s_hbqt_binds = NULL;
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindRelease.........1........." ) );
|
||||
}
|
||||
static HB_TSD_NEW( s_bindData, sizeof( HB_BIND_DATA ), hbqt_bindInit, hbqt_bindRelease );
|
||||
#define hbqt_bindGetData() ( ( ( PHB_BIND_DATA ) hb_stackGetTSD( &s_bindData ) )->s_hbqt_binds )
|
||||
#else
|
||||
static PHB_BIND_DATA s_bindData = NULL;
|
||||
#define hbqt_bindGetData() ( ( ( PHB_BIND_DATA ) &s_bindData )->s_hbqt_binds )
|
||||
#endif
|
||||
|
||||
|
||||
static void hbqt_bindThreadInit( void * cargo )
|
||||
{
|
||||
PHB_BIND_THREADDATA pBindThreadData = ( ( PHB_BIND_THREADDATA ) cargo );
|
||||
|
||||
pBindThreadData->iThreadId = hbqt_bindGetThreadId();
|
||||
pBindThreadData->iObjCreated = 0;
|
||||
pBindThreadData->iObjDestroyed = 0;
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadInit( %i )...STARTS",pBindThreadData->iThreadId ) );
|
||||
pBindThreadData->pDestroyer = new HBQDestroyer();
|
||||
pBindThreadData->pReceiverSlots = new HBQSlots();
|
||||
pBindThreadData->pReceiverEvents = new HBQEvents();
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadInit( %i )...ENDS",pBindThreadData->iThreadId ) );
|
||||
}
|
||||
|
||||
static void hbqt_bindThreadRelease( void * cargo )
|
||||
{
|
||||
PHB_BIND_THREADDATA pBindThreadData = ( ( PHB_BIND_THREADDATA ) cargo );
|
||||
int id = pBindThreadData->iThreadId;
|
||||
int iThreadId = pBindThreadData->iThreadId;
|
||||
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadRelease( %i )...STARTS", id ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( " " ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadRelease( %i, Created: %i, Destroyed: %i )...STARTS", iThreadId, pBindThreadData->iObjCreated, pBindThreadData->iObjDestroyed ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( " " ) );
|
||||
|
||||
QList<PHB_ITEM> deleteIt;
|
||||
QList<PHB_ITEM> deleteIt = hbqt_bindGetObjectListByThread( iThreadId );
|
||||
|
||||
PHBQT_BIND bind;
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind )
|
||||
{
|
||||
if( bind->iThreadId == id )
|
||||
{
|
||||
deleteIt << bind->hbObject;
|
||||
}
|
||||
bind = bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".....hbqt_bindThreadRelease( %i, ToBeReleased: %i )", iThreadId, deleteIt.size() ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadRelease( %i, ToBeReleased=%i )", id, deleteIt.size() ) );
|
||||
int iPass = 0;
|
||||
|
||||
while( ! deleteIt.isEmpty() )
|
||||
{
|
||||
if( hbqt_bindIsHbObject( ( PHB_ITEM ) deleteIt.at( 0 ) ) )
|
||||
iPass++;
|
||||
|
||||
HB_TRACE( HB_TR_DEBUG, ( "........................................................" ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( THREAD = %i, PASS = %i ).......", iThreadId, iPass ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "........................................................" ) );
|
||||
|
||||
int i;
|
||||
// for( i = deleteIt.size()-1; i >= 0 ; i-- ) /* FIFO - Many problems */
|
||||
for( i = 0; i < deleteIt.size(); i++ ) /* LIFO - Some problems */
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadRelease( %i )", id ) );
|
||||
hbqt_bindDestroyHbObject( hb_arrayFromId( NULL, deleteIt.at( 0 ) ) );
|
||||
hb_itemRelease( ( PHB_ITEM ) deleteIt.at( 0 ) );
|
||||
if( deleteIt.at( i ) != NULL )
|
||||
{
|
||||
PHBQT_BIND bind;
|
||||
|
||||
bind = hbqt_bindGetBindByHbObject( deleteIt.at( i ) );
|
||||
if( bind != NULL )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i, %p, %s, PASS = %i, FLAGS = %i ).......", iThreadId, i+1, bind->qtObject, bind->szClassName, iPass, bind->iFlags ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
|
||||
if( bind->iFlags & HBQT_BIT_OWNER )
|
||||
{
|
||||
if( bind->iFlags & HBQT_BIT_QOBJECT )
|
||||
{
|
||||
QObject * qObject = ( QObject * ) bind->qtObject;
|
||||
if( qObject != NULL )
|
||||
{
|
||||
if( qObject->parent() != NULL && qObject->children().size() > 0 )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() != NULL && children() > 0", iThreadId, i+1 ) );
|
||||
hbqt_bindDestroyChildren( bind->hbObject, false );
|
||||
hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
}
|
||||
else if( qObject->parent() != NULL && qObject->children().size() == 0 )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() != NULL && children() == 0", iThreadId, i+1 ) );
|
||||
hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
}
|
||||
else if( qObject->parent() == NULL && qObject->children().size() > 0 )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() == NULL && children() > 0", iThreadId, i+1 ) );
|
||||
hbqt_bindDestroyChildren( bind->hbObject, false );
|
||||
hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
}
|
||||
else if( qObject->parent() == NULL && qObject->children().size() == 0 )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() == NULL && children() == 0", iThreadId, i+1 ) );
|
||||
hbqt_bindDestroyQtObject( bind->qtObject, qObject );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "........Qt Object Seems Destroyed..." ) );
|
||||
hbqt_bindRemoveBind( bind );
|
||||
}
|
||||
}
|
||||
else /* not an QObject object */
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... else no_qOBJECT", iThreadId, i+1 ) );
|
||||
PHB_ITEM pObject = hb_arrayFromId( NULL, bind->hbObject );
|
||||
if( pObject != NULL )
|
||||
{
|
||||
hbqt_bindDestroyHbObject( pObject );
|
||||
hb_itemRelease( pObject );
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
}
|
||||
}
|
||||
else /* Harbour is not the owner */
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i, %p, %s ).......REMOVING BIND", iThreadId, i+1, bind->qtObject, bind->szClassName ) );
|
||||
hbqt_bindRemoveBind( bind );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
}
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i ).............e", iThreadId, i+1 ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
|
||||
}
|
||||
}
|
||||
deleteIt.removeAt( 0 );
|
||||
deleteIt.clear();
|
||||
deleteIt = hbqt_bindGetObjectListByThread( iThreadId );
|
||||
}
|
||||
|
||||
delete pBindThreadData->pDestroyer;
|
||||
delete pBindThreadData->pReceiverSlots;
|
||||
delete pBindThreadData->pReceiverEvents;
|
||||
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadRelease( %i )...ENDS",id ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( " " ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadRelease( %i )...ENDS", iThreadId ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( " " ) );
|
||||
}
|
||||
|
||||
static HB_TSD_NEW( s_bindThreadData, sizeof( HB_BIND_THREADDATA ), hbqt_bindThreadInit, hbqt_bindThreadRelease );
|
||||
#define hbqt_bindGetThreadData() ( ( PHB_BIND_THREADDATA ) hb_stackGetTSD( &s_bindThreadData ) )
|
||||
|
||||
|
||||
static void hbqt_bind_init( void * cargo )
|
||||
{
|
||||
HB_SYMBOL_UNUSED( cargo );
|
||||
@@ -230,38 +292,167 @@ static void hbqt_bind_exit( void * cargo )
|
||||
HB_SYMBOL_UNUSED( cargo );
|
||||
}
|
||||
|
||||
static QList<PHB_ITEM> hbqt_bindGetObjectListByThread( int iThreadId )
|
||||
{
|
||||
QList<PHB_ITEM> deleteIt;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
PHBQT_BIND bind;
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind != NULL )
|
||||
{
|
||||
if( bind->iThreadId == iThreadId )
|
||||
{
|
||||
deleteIt << bind->hbObject;
|
||||
HB_TRACE( HB_TR_DEBUG, ( "...hbqt_bindThreadRelease( %i, %p, %i, %s )", iThreadId, bind->qtObject, deleteIt.size(), bind->szClassName ) );
|
||||
}
|
||||
bind = bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
|
||||
return deleteIt;
|
||||
}
|
||||
|
||||
static PHBQT_BIND hbqt_bindGetBindByQtObject( void * qtObject )
|
||||
{
|
||||
PHBQT_BIND bind, r_bind;
|
||||
|
||||
r_bind = NULL;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind != NULL )
|
||||
{
|
||||
if( bind->qtObject == qtObject )
|
||||
{
|
||||
r_bind = bind;
|
||||
break;
|
||||
}
|
||||
bind = bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
return r_bind;
|
||||
}
|
||||
|
||||
static PHBQT_BIND hbqt_bindGetBindByHbObject( void * hbObject )
|
||||
{
|
||||
PHBQT_BIND bind, r_bind;
|
||||
|
||||
r_bind = NULL;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind != NULL )
|
||||
{
|
||||
if( bind->hbObject == hbObject )
|
||||
{
|
||||
r_bind = bind;
|
||||
break;
|
||||
}
|
||||
bind = bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
return r_bind;
|
||||
}
|
||||
|
||||
static void hbqt_bindRemoveBind( PHBQT_BIND bnd )
|
||||
{
|
||||
if( bnd != NULL )
|
||||
{
|
||||
PHBQT_BIND * bind_ptr, bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind_ptr = &( hbqt_bindGetData() );
|
||||
while( ( bind = * bind_ptr ) != NULL )
|
||||
{
|
||||
if( bind == bnd )
|
||||
{
|
||||
* bind_ptr = bind->next;
|
||||
hb_xfree( bind );
|
||||
hbqt_bindGetThreadData()->iObjDestroyed++;
|
||||
break;
|
||||
}
|
||||
bind_ptr = &bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
}
|
||||
|
||||
static void hbqt_bindAddBind( PHBQT_BIND bind )
|
||||
{
|
||||
if( bind != NULL )
|
||||
{
|
||||
HBQT_BIND_LOCK
|
||||
bind->next = hbqt_bindGetData();
|
||||
hbqt_bindGetData() = bind;
|
||||
hbqt_bindGetThreadData()->iObjCreated++;
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
}
|
||||
|
||||
static void hbqt_bindDestroyChildren( void * hbObject, bool fDeleteSelf )
|
||||
{
|
||||
if( hbObject )
|
||||
{
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByHbObject( hbObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
QObject * qObject = ( QObject * ) bind->qtObject;
|
||||
if( qObject )
|
||||
{
|
||||
QList< QObject *> children = qObject->children();
|
||||
if( children.size() > 0 )
|
||||
{
|
||||
int i;
|
||||
for( i = 0; i < children.size(); i++ )
|
||||
{
|
||||
PHBQT_BIND bnd = hbqt_bindGetBindByQtObject( ( void * ) children.at( i ) );
|
||||
if( bnd != NULL )
|
||||
{
|
||||
hbqt_bindDestroyChildren( bnd->hbObject, true );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( fDeleteSelf )
|
||||
{
|
||||
hbqt_bindDestroyQtObject( ( void * ) qObject, qObject );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PHB_ITEM hbqt_bindGetHbObject( PHB_ITEM pItem, void * qtObject, const char * szClassName, PHBQT_DEL_FUNC pDelFunc, int iFlags )
|
||||
{
|
||||
int id = hbqt_bindGetThreadData()->iThreadId;
|
||||
bool isQObject = iFlags & HBQT_BIT_QOBJECT;
|
||||
|
||||
char * pname = ( char * ) hb_xgrab( 200 );
|
||||
char * pname1 = ( char * ) hb_xgrab( 200 );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......HARBOUR_REQUEST_BIND_OBJECT( %p, %s, %i, %i, %s, %s )", qtObject, szClassName, iFlags, id, hb_procname( 0, pname, HB_TRUE ), hb_procname( 1, pname1, HB_TRUE ) ) );
|
||||
hb_xfree( pname );
|
||||
hb_xfree( pname1 );
|
||||
if( iFlags & HBQT_BIT_QOBJECT )
|
||||
{
|
||||
char * pname = ( char * ) hb_xgrab( 200 );
|
||||
char * pname1 = ( char * ) hb_xgrab( 200 );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......HARBOUR_REQUEST_BIND_OBJECT( %i, %i, %p, %s, %s, %s )", id, iFlags, qtObject, szClassName, hb_procname( 0, pname, HB_TRUE ), hb_procname( 1, pname1, HB_TRUE ) ) );
|
||||
hb_xfree( pname );
|
||||
hb_xfree( pname1 );
|
||||
}
|
||||
|
||||
PHB_ITEM pObject = NULL;
|
||||
|
||||
if( qtObject == NULL )
|
||||
{
|
||||
return pObject;
|
||||
}
|
||||
|
||||
PHB_SYMB pClassFunc = hb_dynsymGetSymbol( szClassName );
|
||||
if( pClassFunc == NULL )
|
||||
return pObject;
|
||||
|
||||
PHBQT_BIND bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind )
|
||||
{
|
||||
if( bind->qtObject == qtObject )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......hbqt_bindGetHbObject( %p ):if( bind->qtObject == qtObject )", qtObject ) );
|
||||
pObject = hb_arrayFromId( pItem, bind->hbObject );
|
||||
break;
|
||||
}
|
||||
bind = bind->next;
|
||||
return pObject;
|
||||
}
|
||||
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByQtObject( qtObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
return hb_arrayFromId( pItem, bind->hbObject );
|
||||
}
|
||||
|
||||
if( pObject == NULL && pClassFunc && hb_vmRequestReenter() )
|
||||
@@ -292,20 +483,20 @@ PHB_ITEM hbqt_bindGetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC
|
||||
bind->fEventFilterInstalled = false;
|
||||
bind->iThreadId = id;
|
||||
hb_strncpy( bind->szClassName, szClassName, HB_SIZEOFARRAY( bind->szClassName ) - 1 );
|
||||
bind->next = hbqt_bindGetData();
|
||||
hbqt_bindGetData() = bind;
|
||||
|
||||
hbqt_bindAddBind( bind );
|
||||
}
|
||||
|
||||
bind->hbObject = hb_arrayId( pObject );
|
||||
|
||||
if( iFlags & HBQT_BIT_QOBJECT )
|
||||
if( isQObject )
|
||||
{
|
||||
QObject * obj = ( QObject * ) qtObject;
|
||||
QString className = ( QString ) obj->metaObject()->className();
|
||||
|
||||
if( pDelFunc != NULL )
|
||||
if( bind->iFlags & HBQT_BIT_OWNER )
|
||||
{
|
||||
QObject::connect( obj, SIGNAL( destroyed(QObject*) ), hbqt_bindGetThreadData()->pDestroyer, SLOT( destroyer() ) );
|
||||
QObject::connect( obj, SIGNAL( destroyed(QObject*) ), hbqt_bindGetThreadData()->pDestroyer, SLOT( destroyer(QObject*) ) );
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......hbqt_bindGetHbObject_connected_to_destroy()( %p, %s )", qtObject, szClassName ) );
|
||||
|
||||
@@ -324,11 +515,130 @@ PHB_ITEM hbqt_bindGetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC
|
||||
}
|
||||
hb_vmRequestRestore();
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
|
||||
return pObject;
|
||||
}
|
||||
|
||||
void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
|
||||
{
|
||||
void * hbObject = hb_arrayId( pObject );
|
||||
|
||||
if( hbObject )
|
||||
{
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByHbObject( hbObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
void * qtObject = bind->qtObject;
|
||||
int iFlags = bind->iFlags;
|
||||
PHBQT_DEL_FUNC pDelFunc = bind->pDelFunc;
|
||||
|
||||
bool fDelQtObject = false;
|
||||
bool isQObject = iFlags & HBQT_BIT_QOBJECT;
|
||||
QObject * qObject = NULL;
|
||||
|
||||
if( isQObject )
|
||||
{
|
||||
qObject = ( QObject * ) qtObject;
|
||||
}
|
||||
if( pDelFunc != NULL )
|
||||
{
|
||||
if( iFlags & HBQT_BIT_OWNER )
|
||||
{
|
||||
if( isQObject )
|
||||
{
|
||||
if( qObject->parent() == NULL )
|
||||
{
|
||||
fDelQtObject = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fDelQtObject = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( isQObject )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".........HARBOUR_DESTROY_BEGINS( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
|
||||
}
|
||||
if( iFlags & HBQT_BIT_OWNER )
|
||||
{
|
||||
if( fDelQtObject )
|
||||
{
|
||||
if( isQObject )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_QT_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
|
||||
qObject->disconnect();
|
||||
if( bind->fEventFilterInstalled )
|
||||
{
|
||||
qObject->removeEventFilter( hbqt_bindGetThreadData()->pReceiverEvents );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_QT_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
|
||||
}
|
||||
hbqt_bindRemoveBind( bind );
|
||||
pDelFunc( qtObject, iFlags );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( isQObject )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_NOT-DESTROYING_HB_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( isQObject )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_HB_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
|
||||
}
|
||||
hbqt_bindRemoveBind( bind );
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".........HARBOUR_DESTROY_ENDS( %p )", qtObject ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void hbqt_bindDestroyQtObject( void * qtObject, QObject * qObject )
|
||||
{
|
||||
if( qtObject )
|
||||
{
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByQtObject( qtObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
if( bind->pDelFunc != NULL )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROYS( %i, %i, %p, %s )..............", bind->iThreadId, bind->iFlags, bind->qtObject, bind->szClassName ) );
|
||||
|
||||
int iFlags = bind->iFlags;
|
||||
PHBQT_DEL_FUNC pDelFunc = bind->pDelFunc;
|
||||
qObject->disconnect();
|
||||
if( bind->fEventFilterInstalled )
|
||||
{
|
||||
qObject->removeEventFilter( hbqt_bindGetThreadData()->pReceiverEvents );
|
||||
}
|
||||
hbqt_bindRemoveBind( bind );
|
||||
pDelFunc( qtObject, iFlags ); /* Though this is not needed as Qt will delete the object,
|
||||
* but may be because Harbour uses is own memory manager,
|
||||
* it seems necessary to reclaim the memory.
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
hbqt_bindRemoveBind( bind ); /* Conceptually it must not reach here, but... It is Qt */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
qObject->disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PHB_ITEM hbqt_bindSetHbObject( PHB_ITEM pItem, void * qtObject, const char * szClassName, PHBQT_DEL_FUNC pDelFunc, int iFlags )
|
||||
{
|
||||
int id = hbqt_bindGetThreadData()->iThreadId;
|
||||
@@ -364,12 +674,14 @@ PHB_ITEM hbqt_bindSetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC
|
||||
|
||||
bind = ( PHBQT_BIND ) hb_xgrab( sizeof( HBQT_BIND ) );
|
||||
memset( bind, 0, sizeof( HBQT_BIND ) );
|
||||
|
||||
bind->qtObject = qtObject;
|
||||
bind->pDelFunc = pDelFunc;
|
||||
bind->iFlags = iFlags;
|
||||
bind->fEventFilterInstalled = false;
|
||||
bind->iThreadId = id;
|
||||
hb_strncpy( bind->szClassName, szClassName, HB_SIZEOFARRAY( bind->szClassName ) - 1 );
|
||||
|
||||
bind->next = hbqt_bindGetData();
|
||||
hbqt_bindGetData() = bind;
|
||||
|
||||
@@ -377,11 +689,22 @@ PHB_ITEM hbqt_bindSetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC
|
||||
|
||||
if( iFlags & HBQT_BIT_QOBJECT )
|
||||
{
|
||||
if( pDelFunc != NULL )
|
||||
QObject * obj = ( QObject * ) qtObject;
|
||||
QString className = ( QString ) obj->metaObject()->className();
|
||||
|
||||
if( bind->iFlags & HBQT_BIT_OWNER )
|
||||
{
|
||||
QObject::connect( ( QObject * ) qtObject, SIGNAL( destroyed(QObject*) ), hbqt_bindGetThreadData()->pDestroyer, SLOT( destroyer() ) );
|
||||
QObject::connect( obj, SIGNAL( destroyed(QObject*) ), hbqt_bindGetThreadData()->pDestroyer, SLOT( destroyer(QObject*) ) );
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......hbqt_bindSetHbObject( QObject %p )...%s", qtObject, ( ( QObject * ) qtObject )->metaObject()->className() ) );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "......hbqt_bindSetHbObject_connected_to_destroy()( %p, %s )", qtObject, szClassName ) );
|
||||
|
||||
hb_vmPushDynSym( s_dynsym_SETSLOTS ); /* initializes __Slots hash */
|
||||
hb_vmPush( pObject );
|
||||
hb_vmSend( 0 );
|
||||
|
||||
hb_vmPushDynSym( s_dynsym_SETEVENTS ); /* initializes __Events hash */
|
||||
hb_vmPush( pObject );
|
||||
hb_vmSend( 0 );
|
||||
}
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
@@ -390,113 +713,17 @@ PHB_ITEM hbqt_bindSetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC
|
||||
return pObject;
|
||||
}
|
||||
|
||||
void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
|
||||
{
|
||||
void * hbObject = hb_arrayId( pObject );
|
||||
|
||||
if( hbObject )
|
||||
{
|
||||
PHBQT_BIND * bind_ptr, bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind_ptr = &( hbqt_bindGetData() );
|
||||
while( ( bind = * bind_ptr ) != NULL )
|
||||
{
|
||||
if( bind->hbObject == hbObject )
|
||||
{
|
||||
void * qtObject = bind->qtObject;
|
||||
int iFlags = bind->iFlags;
|
||||
PHBQT_DEL_FUNC pDelFunc = bind->pDelFunc;
|
||||
|
||||
bool fDelQtObject = false;
|
||||
bool isQObject = iFlags & HBQT_BIT_QOBJECT;
|
||||
QObject * qObject = NULL;
|
||||
|
||||
if( isQObject )
|
||||
qObject = ( QObject * ) qtObject;
|
||||
|
||||
if( pDelFunc != NULL )
|
||||
{
|
||||
if( iFlags & HBQT_BIT_OWNER )
|
||||
{
|
||||
if( isQObject )
|
||||
{
|
||||
if( qObject->metaObject()->className() != ( const char * ) "QAction" )
|
||||
{
|
||||
if( qObject->parent() == NULL )
|
||||
{
|
||||
fDelQtObject = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fDelQtObject = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".........HARBOUR_DESTROY_BEGINS( %p, %s, Thread( %i ) )", qtObject, bind->szClassName, bind->iThreadId ) );
|
||||
* bind_ptr = bind->next;
|
||||
hb_xfree( bind );
|
||||
|
||||
if( fDelQtObject )
|
||||
{
|
||||
pDelFunc( qtObject, iFlags );
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( ".........HARBOUR_DESTROY_ENDS( %p )", qtObject ) );
|
||||
break;
|
||||
}
|
||||
bind_ptr = &bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
}
|
||||
|
||||
void hbqt_bindDestroyQtObject( void * qtObject )
|
||||
{
|
||||
if( qtObject )
|
||||
{
|
||||
PHBQT_BIND * bind_ptr, bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind_ptr = &( hbqt_bindGetData() );
|
||||
while( ( bind = * bind_ptr ) != NULL )
|
||||
{
|
||||
if( bind->qtObject == qtObject )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_BEGINS( %p, %s )..............", qtObject, bind->szClassName ) );
|
||||
* bind_ptr = bind->next;
|
||||
hb_xfree( bind );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_ENDS( %p )..............", qtObject ) );
|
||||
break;
|
||||
}
|
||||
bind_ptr = &bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
}
|
||||
|
||||
HBQSlots * hbqt_bindGetReceiverSlotsByHbObject( PHB_ITEM pObject )
|
||||
{
|
||||
HBQSlots * pReceiverSlot = NULL;
|
||||
if( pObject != NULL )
|
||||
{
|
||||
void * hbObject = hb_arrayId( pObject );
|
||||
PHBQT_BIND bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind )
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByHbObject( hbObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
if( bind->hbObject == hbObject )
|
||||
{
|
||||
pReceiverSlot = hbqt_bindGetThreadData()->pReceiverSlots;
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hbqt_bindGetReceiverSlotByHbObject( %p )", bind->qtObject ) );
|
||||
break;
|
||||
}
|
||||
bind = bind->next;
|
||||
pReceiverSlot = hbqt_bindGetThreadData()->pReceiverSlots;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
return pReceiverSlot;
|
||||
}
|
||||
@@ -507,26 +734,17 @@ HBQEvents * hbqt_bindGetReceiverEventsByHbObject( PHB_ITEM pObject )
|
||||
if( pObject != NULL )
|
||||
{
|
||||
void * hbObject = hb_arrayId( pObject );
|
||||
PHBQT_BIND bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind )
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByHbObject( hbObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
if( bind->hbObject == hbObject )
|
||||
pReceiverEvents = hbqt_bindGetThreadData()->pReceiverEvents;
|
||||
if( ! bind->fEventFilterInstalled )
|
||||
{
|
||||
pReceiverEvents = hbqt_bindGetThreadData()->pReceiverEvents;
|
||||
if( ! bind->fEventFilterInstalled )
|
||||
{
|
||||
bind->fEventFilterInstalled = true;
|
||||
hbqt_bindGetThreadData()->pReceiverEvents->hbInstallEventFilter( pObject );
|
||||
}
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hbqt_bindGetReceiverEventsByHbObject( %p )", bind->qtObject ) );
|
||||
break;
|
||||
bind->fEventFilterInstalled = true;
|
||||
hbqt_bindGetThreadData()->pReceiverEvents->hbInstallEventFilter( pObject );
|
||||
}
|
||||
bind = bind->next;
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hbqt_bindGetReceiverEventsByHbObject( %p )", bind->qtObject ) );
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
return pReceiverEvents;
|
||||
}
|
||||
@@ -555,27 +773,6 @@ PHB_ITEM hbqt_bindGetHbObjectByQtObject( void * qtObject )
|
||||
return pObject;
|
||||
}
|
||||
|
||||
int hbqt_bindIsHbObject( PHB_ITEM pObject )
|
||||
{
|
||||
PHBQT_BIND bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hbqt_bindIsHbObject( %p )", bind->qtObject ) );
|
||||
|
||||
if( bind->hbObject == pObject )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
bind = bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void * hbqt_bindGetQtObject( PHB_ITEM pObject )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hbqt_bindGetQtObject()" ) );
|
||||
@@ -585,45 +782,29 @@ void * hbqt_bindGetQtObject( PHB_ITEM pObject )
|
||||
|
||||
if( hbObject )
|
||||
{
|
||||
PHBQT_BIND bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind )
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByHbObject( hbObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "hbqt_bindGetQtObject( %p )", bind->qtObject ) );
|
||||
|
||||
if( bind->hbObject == hbObject )
|
||||
{
|
||||
qtObject = bind->qtObject;
|
||||
break;
|
||||
}
|
||||
bind = bind->next;
|
||||
qtObject = bind->qtObject;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
return qtObject;
|
||||
}
|
||||
|
||||
void hbqt_bindSetOwner( void * qtObject, HB_BOOL fOwner )
|
||||
{
|
||||
PHBQT_BIND bind;
|
||||
|
||||
HBQT_BIND_LOCK
|
||||
bind = hbqt_bindGetData();
|
||||
while( bind )
|
||||
PHBQT_BIND bind = hbqt_bindGetBindByQtObject( qtObject );
|
||||
if( bind != NULL )
|
||||
{
|
||||
if( bind->qtObject == qtObject )
|
||||
if( fOwner == HB_TRUE )
|
||||
{
|
||||
if( fOwner == HB_TRUE )
|
||||
bind->iFlags = bind->iFlags | HBQT_BIT_OWNER;
|
||||
else
|
||||
bind->iFlags = bind->iFlags & ~( HBQT_BIT_OWNER );
|
||||
break;
|
||||
bind->iFlags = bind->iFlags | HBQT_BIT_OWNER;
|
||||
}
|
||||
else
|
||||
{
|
||||
bind->iFlags = bind->iFlags & ~( HBQT_BIT_OWNER );
|
||||
}
|
||||
bind = bind->next;
|
||||
}
|
||||
HBQT_BIND_UNLOCK
|
||||
}
|
||||
|
||||
void hbqt_bindAddSlot( PHB_ITEM pSenderObject, int iSignalid, PHB_ITEM pCode )
|
||||
@@ -959,3 +1140,4 @@ HB_CALL_ON_STARTUP_END( _hbqt_bind_init_ )
|
||||
#define HB_DATASEG_BODY HB_DATASEG_FUNC( _hbqt_bind_init_ )
|
||||
#include "hbiniseg.h"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -70,11 +70,12 @@ HBQDestroyer::~HBQDestroyer()
|
||||
{
|
||||
}
|
||||
|
||||
void HBQDestroyer::destroyer()
|
||||
void HBQDestroyer::destroyer( QObject * obj )
|
||||
{
|
||||
HB_TRACE( HB_TR_DEBUG, ( "HBQDestroyer::destroyer( %p )", this->sender() ) );
|
||||
|
||||
hbqt_bindDestroyQtObject( this->sender() );
|
||||
Q_UNUSED( obj );
|
||||
HB_TRACE( HB_TR_DEBUG, ( "............HBQDestroyer::destroyer( %p )", this->sender() ) );
|
||||
|
||||
hbqt_bindDestroyQtObject( this->sender(), obj );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
~HBQDestroyer();
|
||||
|
||||
public slots:
|
||||
void destroyer();
|
||||
void destroyer( QObject * obj = 0 );
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
@@ -46,12 +46,12 @@ enum Direction { LeftToRight, RightToLeft, TopToBottom, BottomToTop }
|
||||
</ENUMS>
|
||||
|
||||
<PROTOS>
|
||||
void addLayout ( QLayout * layout, int stretch = 0 ) [*D=1*]
|
||||
void addSpacerItem ( QSpacerItem * spacerItem ) [*D=1*]
|
||||
void addLayout ( QLayout * layout, int stretch = 0 ) [*X=1*]
|
||||
void addSpacerItem ( QSpacerItem * spacerItem ) [*X=1*]
|
||||
void addSpacing ( int size )
|
||||
void addStretch ( int stretch = 0 )
|
||||
void addStrut ( int size )
|
||||
void addWidget ( QWidget * widget, int stretch = 0, Qt::Alignment alignment = 0 ) [*D=1*]
|
||||
void addWidget ( QWidget * widget, int stretch = 0, Qt::Alignment alignment = 0 ) [*X=1*]
|
||||
Direction direction () const
|
||||
void insertLayout ( int index, QLayout * layout, int stretch = 0 )
|
||||
void insertSpacerItem ( int index, QSpacerItem * spacerItem )
|
||||
|
||||
@@ -97,7 +97,7 @@ void setModelColumn ( int visibleColumn )
|
||||
void setRootModelIndex ( const QModelIndex & index )
|
||||
void setSizeAdjustPolicy ( SizeAdjustPolicy policy )
|
||||
void setValidator ( const QValidator * validator )
|
||||
void setView ( QAbstractItemView * itemView ) [*D=1*]
|
||||
void setView ( QAbstractItemView * itemView ) [*X=1*]
|
||||
virtual void showPopup ()
|
||||
SizeAdjustPolicy sizeAdjustPolicy () const
|
||||
virtual const QValidator * validator () const
|
||||
|
||||
@@ -32,6 +32,14 @@ HB_FUNC( QT_QDIRMODEL )
|
||||
{
|
||||
__HB_RETPTRGC__( new QDirModel( hbqt_par_QObject( 1 ) ) );
|
||||
}
|
||||
else if( hb_pcount() == 4 && hbqt_par_isDerivedFrom( 1, "QSTRINGLIST" ) && HB_ISNUM( 2 ) && HB_ISNUM( 3 ) && hbqt_par_isDerivedFrom( 4, "QOBJECT" ) )
|
||||
{
|
||||
__HB_RETPTRGC__( new QDirModel( *hbqt_par_QStringList( 1 ), ( QDir::Filters ) hb_parni( 2 ), ( QDir::SortFlags ) hb_parni( 3 ), hbqt_par_QObject( 4 ) ) );
|
||||
}
|
||||
else if( hb_pcount() == 3 && hbqt_par_isDerivedFrom( 1, "QSTRINGLIST" ) && HB_ISNUM( 2 ) && HB_ISNUM( 3 ) )
|
||||
{
|
||||
__HB_RETPTRGC__( new QDirModel( *hbqt_par_QStringList( 1 ), ( QDir::Filters ) hb_parni( 2 ), ( QDir::SortFlags ) hb_parni( 3 ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
__HB_RETPTRGC__( new QDirModel() );
|
||||
|
||||
@@ -73,8 +73,8 @@ bool isFloating () const
|
||||
void setAllowedAreas ( Qt::DockWidgetAreas areas )
|
||||
void setFeatures ( DockWidgetFeatures features )
|
||||
void setFloating ( bool floating )
|
||||
void setTitleBarWidget ( QWidget * widget ) [*D=1*]
|
||||
void setWidget ( QWidget * widget ) [*D=1*]
|
||||
void setTitleBarWidget ( QWidget * widget ) [*X=1*]
|
||||
void setWidget ( QWidget * widget ) [*X=1*]
|
||||
QWidget * titleBarWidget () const
|
||||
QAction * toggleViewAction () const
|
||||
QWidget * widget () const
|
||||
|
||||
@@ -52,7 +52,7 @@ QMimeData * mimeData () const
|
||||
QPixmap pixmap () const
|
||||
void setDragCursor ( const QPixmap & cursor, Qt::DropAction action )
|
||||
void setHotSpot ( const QPoint & hotspot )
|
||||
void setMimeData ( QMimeData * data ) [*D=1*]
|
||||
void setMimeData ( QMimeData * data ) [*X=1*]
|
||||
void setPixmap ( const QPixmap & pixmap )
|
||||
QWidget * source () const
|
||||
QWidget * target () const
|
||||
|
||||
@@ -67,7 +67,7 @@ flags SceneLayers
|
||||
QGraphicsWidget * activeWindow () const
|
||||
QGraphicsEllipseItem * addEllipse ( const QRectF & rect, const QPen & pen = QPen(), const QBrush & brush = QBrush() )
|
||||
QGraphicsEllipseItem * addEllipse ( qreal x, qreal y, qreal w, qreal h, const QPen & pen = QPen(), const QBrush & brush = QBrush() )
|
||||
void addItem ( QGraphicsItem * item ) [*D=1*]
|
||||
void addItem ( QGraphicsItem * item ) [*X=1*]
|
||||
QGraphicsLineItem * addLine ( const QLineF & line, const QPen & pen = QPen() )
|
||||
QGraphicsLineItem * addLine ( qreal x1, qreal y1, qreal x2, qreal y2, const QPen & pen = QPen() )
|
||||
QGraphicsPathItem * addPath ( const QPainterPath & path, const QPen & pen = QPen(), const QBrush & brush = QBrush() )
|
||||
|
||||
@@ -39,11 +39,11 @@ HB_FUNC( QT_QGRIDLAYOUT )
|
||||
</CODE>
|
||||
|
||||
<PROTOS>
|
||||
void addItem ( QLayoutItem * item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = 0 ) [*D=1*]
|
||||
void addLayout ( QLayout * layout, int row, int column, Qt::Alignment alignment = 0 ) [*D=1*]
|
||||
void addLayout ( QLayout * layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) [*D=1*]
|
||||
void addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 ) [*D=1*]
|
||||
void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) [*D=1*]
|
||||
void addItem ( QLayoutItem * item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = 0 ) [*X=1*]
|
||||
void addLayout ( QLayout * layout, int row, int column, Qt::Alignment alignment = 0 ) [*X=1*]
|
||||
void addLayout ( QLayout * layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) [*X=1*]
|
||||
void addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 ) [*X=1*]
|
||||
void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) [*X=1*]
|
||||
QRect cellRect ( int row, int column ) const
|
||||
int columnCount () const
|
||||
int columnMinimumWidth ( int column ) const
|
||||
|
||||
@@ -37,8 +37,8 @@ enum SizeConstraint { SetDefaultConstraint, SetFixedSize, SetMinimumSize, SetMax
|
||||
|
||||
<PROTOS>
|
||||
bool activate ()
|
||||
virtual void addItem ( QLayoutItem * item ) [*D=1*]
|
||||
void addWidget ( QWidget * w ) [*D=1*]
|
||||
virtual void addItem ( QLayoutItem * item ) [*X=1*]
|
||||
void addWidget ( QWidget * w ) [*X=1*]
|
||||
QRect contentsRect () const
|
||||
virtual int count () const = 0
|
||||
virtual Qt::Orientations expandingDirections () const
|
||||
@@ -57,7 +57,7 @@ void setAlignment ( Qt::Alignment alignment )
|
||||
bool setAlignment ( QLayout * l, Qt::Alignment alignment )
|
||||
void setContentsMargins ( int left, int top, int right, int bottom )
|
||||
void setEnabled ( bool enable )
|
||||
void setMenuBar ( QWidget * widget ) [*D=1*]
|
||||
void setMenuBar ( QWidget * widget ) [*X=1*]
|
||||
void setSizeConstraint ( SizeConstraint )
|
||||
void setSpacing ( int )
|
||||
SizeConstraint sizeConstraint () const
|
||||
|
||||
@@ -70,10 +70,10 @@ flags DockOptions
|
||||
|
||||
<PROTOS>
|
||||
|
||||
void addDockWidget ( Qt::DockWidgetArea area, QDockWidget * dockwidget ) [*D=2*]
|
||||
void addDockWidget ( Qt::DockWidgetArea area, QDockWidget * dockwidget, Qt::Orientation orientation ) [*D=2*]
|
||||
void addToolBar ( Qt::ToolBarArea area, QToolBar * toolbar ) [*D=2*]
|
||||
void addToolBar ( QToolBar * toolbar ) [*D=1*]
|
||||
void addDockWidget ( Qt::DockWidgetArea area, QDockWidget * dockwidget ) [*X=2*]
|
||||
void addDockWidget ( Qt::DockWidgetArea area, QDockWidget * dockwidget, Qt::Orientation orientation ) [*X=2*]
|
||||
void addToolBar ( Qt::ToolBarArea area, QToolBar * toolbar ) [*X=2*]
|
||||
void addToolBar ( QToolBar * toolbar ) [*X=1*]
|
||||
QToolBar * addToolBar ( const QString & title ) // NOT implemented
|
||||
void addToolBarBreak ( Qt::ToolBarArea area = Qt::TopToolBarArea )
|
||||
QWidget * centralWidget () const
|
||||
@@ -83,7 +83,7 @@ DockOptions dockOptions () const
|
||||
Qt::DockWidgetArea dockWidgetArea ( QDockWidget * dockwidget ) const
|
||||
bool documentMode () const
|
||||
QSize iconSize () const
|
||||
void insertToolBar ( QToolBar * before, QToolBar * toolbar ) [*D=2*]
|
||||
void insertToolBar ( QToolBar * before, QToolBar * toolbar ) [*X=2*]
|
||||
void insertToolBarBreak ( QToolBar * before )
|
||||
bool isAnimated () const
|
||||
bool isDockNestingEnabled () const
|
||||
@@ -95,14 +95,14 @@ void removeToolBarBreak ( QToolBar * before )
|
||||
bool restoreDockWidget ( QDockWidget * dockwidget )
|
||||
bool restoreState ( const QByteArray & state, int Version = 0 )
|
||||
QByteArray saveState ( int Version = 0 ) const
|
||||
void setCentralWidget ( QWidget * widget ) [*D=1*]
|
||||
void setCentralWidget ( QWidget * widget ) [*X=1*]
|
||||
void setCorner ( Qt::Corner corner, Qt::DockWidgetArea area )
|
||||
void setDockOptions ( DockOptions options )
|
||||
void setDocumentMode ( bool enabled )
|
||||
void setIconSize ( const QSize & iconSize )
|
||||
void setMenuBar ( QMenuBar * menuBar ) [*D=1*]
|
||||
void setMenuWidget ( QWidget * menuBar ) [*D=1*]
|
||||
void setStatusBar ( QStatusBar * statusbar ) [*D=1*]
|
||||
void setMenuBar ( QMenuBar * menuBar ) [*X=1*]
|
||||
void setMenuWidget ( QWidget * menuBar ) [*X=1*]
|
||||
void setStatusBar ( QStatusBar * statusbar ) [*X=1*]
|
||||
void setTabPosition ( Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition )
|
||||
void setTabShape ( QTabWidget::TabShape tabShape )
|
||||
void setToolButtonStyle ( Qt::ToolButtonStyle toolButtonStyle )
|
||||
|
||||
@@ -62,7 +62,7 @@ QAction * addAction ( const QString & text, const QObject * receiver, const char
|
||||
QAction * addAction ( const QIcon & icon, const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0 ) [*R=1*]
|
||||
void addAction ( QAction * action )
|
||||
|
||||
QAction * addMenu ( QMenu * menu ) [*D=1;R=1*]
|
||||
QAction * addMenu ( QMenu * menu ) [*X=1;R=1*]
|
||||
QMenu * addMenu ( const QString & title ) [*R=1*]
|
||||
QMenu * addMenu ( const QIcon & icon, const QString & title ) [*R=1*]
|
||||
|
||||
@@ -75,7 +75,7 @@ QAction * exec ( const QPoint & p, QAction * action = 0 )
|
||||
|
||||
void hideTearOffMenu ()
|
||||
QIcon icon () const
|
||||
QAction * insertMenu ( QAction * before, QMenu * menu ) [*D=2;R=1*]
|
||||
QAction * insertMenu ( QAction * before, QMenu * menu ) [*X=2;R=1*]
|
||||
QAction * insertSeparator ( QAction * before ) [*R=1*]
|
||||
bool isEmpty () const
|
||||
bool isTearOffEnabled () const
|
||||
|
||||
@@ -42,13 +42,13 @@ QAction * activeAction () const
|
||||
QAction * addAction ( const QString & text ) [*R=1*]
|
||||
QAction * addAction ( const QString & text, const QObject * receiver, const char * member ) [*R=1*]
|
||||
void addAction ( QAction * action )
|
||||
QAction * addMenu ( QMenu * menu ) [*D=1;R=1*]
|
||||
QAction * addMenu ( QMenu * menu ) [*X=1;R=1*]
|
||||
QMenu * addMenu ( const QString & title )
|
||||
QMenu * addMenu ( const QIcon & icon, const QString & title )
|
||||
QAction * addSeparator ()
|
||||
void clear ()
|
||||
// QAction * defaultAction () const
|
||||
QAction * insertMenu ( QAction * before, QMenu * menu ) [*D=2;R=1*]
|
||||
QAction * insertMenu ( QAction * before, QMenu * menu ) [*X=2;R=1*]
|
||||
QAction * insertSeparator ( QAction * before ) [*R=1*]
|
||||
bool isDefaultUp () const
|
||||
// OSMenuRef macMenu ()
|
||||
|
||||
@@ -42,7 +42,7 @@ Qt::Alignment alignment () const
|
||||
void ensureVisible ( int x, int y, int xmargin = 50, int ymargin = 50 )
|
||||
void ensureWidgetVisible ( QWidget * childWidget, int xmargin = 50, int ymargin = 50 )
|
||||
void setAlignment ( Qt::Alignment )
|
||||
void setWidget ( QWidget * widget ) [*D=1*]
|
||||
void setWidget ( QWidget * widget ) [*X=1*]
|
||||
void setWidgetResizable ( bool resizable )
|
||||
QWidget * takeWidget () [*A=1*]
|
||||
QWidget * widget () const
|
||||
|
||||
@@ -51,31 +51,31 @@ HB_FUNC( QT_QSTANDARDITEMMODEL )
|
||||
</ENUMS>
|
||||
|
||||
<PROTOS>
|
||||
void appendColumn ( const QList<QStandardItem *> & items ) [*D=1*]
|
||||
void appendRow ( const QList<QStandardItem *> & items ) [*D=1*]
|
||||
void appendRow ( QStandardItem * item ) [*D=1*]
|
||||
void appendColumn ( const QList<QStandardItem *> & items ) [*X=1*]
|
||||
void appendRow ( const QList<QStandardItem *> & items ) [*X=1*]
|
||||
void appendRow ( QStandardItem * item ) [*X=1*]
|
||||
void clear ()
|
||||
QList<QStandardItem *> findItems ( const QString & text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0 ) const
|
||||
QStandardItem * horizontalHeaderItem ( int column ) const
|
||||
QModelIndex indexFromItem ( const QStandardItem * item ) const
|
||||
void insertColumn ( int column, const QList<QStandardItem *> & items ) [*D=2*]
|
||||
bool insertColumn ( int column, const QModelIndex & parent = QModelIndex() ) [*D=2*]
|
||||
void insertRow ( int row, const QList<QStandardItem *> & items ) [*D=2*]
|
||||
bool insertRow ( int row, const QModelIndex & parent = QModelIndex() ) [*D=2*]
|
||||
void insertRow ( int row, QStandardItem * item ) [*D=2*]
|
||||
void insertColumn ( int column, const QList<QStandardItem *> & items ) [*X=2*]
|
||||
bool insertColumn ( int column, const QModelIndex & parent = QModelIndex() ) [*X=2*]
|
||||
void insertRow ( int row, const QList<QStandardItem *> & items ) [*X=2*]
|
||||
bool insertRow ( int row, const QModelIndex & parent = QModelIndex() ) [*X=2*]
|
||||
void insertRow ( int row, QStandardItem * item ) [*X=2*]
|
||||
QStandardItem * invisibleRootItem () const
|
||||
QStandardItem * item ( int row, int column = 0 ) const
|
||||
QStandardItem * itemFromIndex ( const QModelIndex & index ) const
|
||||
// const QStandardItem * itemPrototype () const
|
||||
void setColumnCount ( int columns )
|
||||
void setHorizontalHeaderItem ( int column, QStandardItem * item ) [*D=2*]
|
||||
void setHorizontalHeaderItem ( int column, QStandardItem * item ) [*X=2*]
|
||||
void setHorizontalHeaderLabels ( const QStringList & labels )
|
||||
void setItem ( int row, int column, QStandardItem * item ) [*D=3*]
|
||||
void setItem ( int row, QStandardItem * item ) [*D=2*]
|
||||
void setItemPrototype ( const QStandardItem * item ) [*D=1*]
|
||||
void setItem ( int row, int column, QStandardItem * item ) [*X=3*]
|
||||
void setItem ( int row, QStandardItem * item ) [*X=2*]
|
||||
void setItemPrototype ( const QStandardItem * item ) [*X=1*]
|
||||
void setRowCount ( int rows )
|
||||
void setSortRole ( int role )
|
||||
void setVerticalHeaderItem ( int row, QStandardItem * item ) [*D=2*]
|
||||
void setVerticalHeaderItem ( int row, QStandardItem * item ) [*X=2*]
|
||||
void setVerticalHeaderLabels ( const QStringList & labels )
|
||||
int sortRole () const
|
||||
QList<QStandardItem *> takeColumn ( int column ) [*A=1*]
|
||||
|
||||
@@ -42,8 +42,8 @@ HB_FUNC( QT_QSTATUSBAR )
|
||||
</ENUMS>
|
||||
|
||||
<PROTOS>
|
||||
void addPermanentWidget ( QWidget * widget, int stretch = 0 ) [*D=1*]
|
||||
void addWidget ( QWidget * widget, int stretch = 0 ) [*D=1*]
|
||||
void addPermanentWidget ( QWidget * widget, int stretch = 0 ) [*X=1*]
|
||||
void addWidget ( QWidget * widget, int stretch = 0 ) [*X=1*]
|
||||
QString currentMessage () const
|
||||
int insertPermanentWidget ( int index, QWidget * widget, int stretch = 0 )
|
||||
int insertWidget ( int index, QWidget * widget, int stretch = 0 )
|
||||
|
||||
@@ -43,8 +43,8 @@ enum TabShape { Rounded, Triangular }
|
||||
</ENUMS>
|
||||
|
||||
<PROTOS>
|
||||
int addTab ( QWidget * page, const QString & label ) [*D=1*]
|
||||
int addTab ( QWidget * page, const QIcon & icon, const QString & label ) [*D=1*]
|
||||
int addTab ( QWidget * page, const QString & label ) [*X=1*]
|
||||
int addTab ( QWidget * page, const QIcon & icon, const QString & label ) [*X=1*]
|
||||
void clear ()
|
||||
QWidget * cornerWidget ( Qt::Corner corner = Qt::TopRightCorner ) const
|
||||
int count () const
|
||||
|
||||
@@ -57,9 +57,9 @@ void addAction ( QAction * action )
|
||||
QAction * addAction ( const QString & text ) [*R=1*]
|
||||
QAction * addAction ( const QIcon & icon, const QString & text ) [*R=1*]
|
||||
QAction * addAction ( const QString & text, const QObject * receiver, const char * member ) [*R=1*]
|
||||
QAction * addAction ( const QIcon & icon, const QString & text, const QObject * receiver, const char * member ) [*D=3;R=1*]
|
||||
QAction * addAction ( const QIcon & icon, const QString & text, const QObject * receiver, const char * member ) [*X=3;R=1*]
|
||||
QAction * addSeparator () [*R=1*]
|
||||
QAction * addWidget ( QWidget * widget ) [*D=1;R=1*]
|
||||
QAction * addWidget ( QWidget * widget ) [*X=1;R=1*]
|
||||
Qt::ToolBarAreas allowedAreas () const
|
||||
void clear ()
|
||||
QSize iconSize () const
|
||||
|
||||
@@ -67,8 +67,8 @@ enum ItemType { Type, UserType }
|
||||
</ENUMS>
|
||||
|
||||
<PROTOS>
|
||||
void addChild ( QTreeWidgetItem * child ) [*D=1*]
|
||||
void addChildren ( const QList<QTreeWidgetItem *> & children ) [*D=1*]
|
||||
void addChild ( QTreeWidgetItem * child ) [*X=1*]
|
||||
void addChildren ( const QList<QTreeWidgetItem *> & children ) [*X=1*]
|
||||
QBrush background ( int column ) const
|
||||
Qt::CheckState checkState ( int column ) const
|
||||
QTreeWidgetItem * child ( int index ) const
|
||||
|
||||
@@ -201,7 +201,7 @@ void setGeometry ( const QRect & )
|
||||
void setGeometry ( int x, int y, int w, int h )
|
||||
|
||||
// void setInputContext ( QInputContext * context )
|
||||
void setLayout ( QLayout * layout ) [*D=1*]
|
||||
void setLayout ( QLayout * layout ) [*X=1*]
|
||||
void setLayoutDirection ( Qt::LayoutDirection direction )
|
||||
void setLocale ( const QLocale & locale )
|
||||
|
||||
|
||||
@@ -70,27 +70,31 @@
|
||||
*/
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
STATIC oSys, oMenuSys, oActShow, oActHide
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
FUNCTION My_Events( oWnd, e )
|
||||
MsgInfo( oWnd, "Pressed: " + hb_ntos( e:key() ) )
|
||||
RETURN nil
|
||||
STATIC oSys, oMenuSys, oActShow, oActHide /* To keep variables in scope for entire duration of appn */
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
PROCEDURE Main()
|
||||
Local oBtn, oDA, oWnd, oSBar, aMenu, aTool, aTabs, oELoop, lExit := .f.
|
||||
|
||||
hbqt_errorsys()
|
||||
|
||||
ExecTheDialog()
|
||||
|
||||
RETURN
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
PROCEDURE ExecTheDialog()
|
||||
LOCAL oBtn, oDA, oWnd, aMenu, aTool, aTabs, oELoop, lExit := .f.
|
||||
|
||||
hbqt_errorsys()
|
||||
|
||||
oWnd := QMainWindow()
|
||||
oWnd:setAttribute( Qt_WA_DeleteOnClose, .f. )
|
||||
oWnd:setAttribute( Qt_WA_DeleteOnClose, .F. )
|
||||
oWnd:show()
|
||||
|
||||
oWnd:setMouseTracking( .t. )
|
||||
oWnd:setWindowTitle( "Harbour-Qt Implementation Test Dialog" )
|
||||
oWnd:setWindowTitle( "[" + hb_ntos( hb_threadID() ) + "] Harbour-Qt" )
|
||||
oWnd:setWindowIcon( QIcon( "test" ) )
|
||||
oWnd:resize( 900, 500 )
|
||||
|
||||
@@ -100,18 +104,16 @@ PROCEDURE Main()
|
||||
aMenu := Build_MenuBar( oWnd )
|
||||
aTool := Build_ToolBar( oWnd )
|
||||
|
||||
oSBar := QStatusBar( oWnd )
|
||||
oWnd:setStatusBar( oSBar )
|
||||
oSBar:showMessage( "Harbour-QT Statusbar Ready!" )
|
||||
oWnd:statusBar():showMessage( "Harbour-QT Statusbar Ready!" )
|
||||
|
||||
Build_Grid( oDA, { 30, 30 }, { 450,150 } )
|
||||
Build_ProgressBar( oDA, { 30,300 }, { 200,30 } )
|
||||
Build_ListBox( oDA, { 310,240 }, { 150, 100 } )
|
||||
Build_Label( oDA, { 30,190 }, { 300, 30 } )
|
||||
|
||||
aTabs := Build_Tabs( oDA, { 510, 5 }, { 360, 400 } )
|
||||
aTabs := Build_Tabs( oDA, { 510, 5 }, { 360, 400 } )
|
||||
|
||||
oBtn := Build_PushButton( oDA, { 30,240 }, { 100,50 } )
|
||||
oBtn := Build_PushButton( oDA, { 30,240 }, { 100,50 } )
|
||||
oBtn:setStyleSheet( "background: #a00fff;" )
|
||||
|
||||
oWnd:connect( QEvent_KeyPress, {|e| My_Events( oWnd, e ) } )
|
||||
@@ -127,12 +129,22 @@ PROCEDURE Main()
|
||||
ENDDO
|
||||
oELoop:exit( 0 )
|
||||
|
||||
HB_TRACE( HB_TR_DEBUG, ".............. E X I T I N G ..................." )
|
||||
xReleaseMemory( { oBtn, aMenu, aTool, aTabs, oDA, oWnd } )
|
||||
|
||||
HB_TRACE( HB_TR_DEBUG, " " )
|
||||
HB_TRACE( HB_TR_DEBUG, ".............. E X I T I N G ...................", hb_threadID() )
|
||||
HB_TRACE( HB_TR_DEBUG, " " )
|
||||
|
||||
RETURN
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
FUNCTION My_Events( oWnd, e )
|
||||
MsgInfo( oWnd, "Pressed: " + hb_ntos( e:key() ) )
|
||||
RETURN nil
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
FUNCTION xReleaseMemory( aObj )
|
||||
#if 0
|
||||
LOCAL i
|
||||
@@ -150,61 +162,14 @@ FUNCTION xReleaseMemory( aObj )
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
PROCEDURE ExecOneMore()
|
||||
Local oLabel, oBtn, oDA, oWnd, oProg, oSBar
|
||||
LOCAL aMenu, aTool, aGrid, aTabs, aList, oEventLoop
|
||||
LOCAL lExit := .f.
|
||||
|
||||
oWnd := QMainWindow()
|
||||
|
||||
oWnd:setMouseTracking( .t. )
|
||||
oWnd:setWindowTitle( "Harbour-Qt Implementation Test Dialog" )
|
||||
oWnd:setWindowIcon( QIcon( "test" ) )
|
||||
oWnd:resize( 900, 500 )
|
||||
|
||||
oDA := QWidget( oWnd )
|
||||
oWnd:setCentralWidget( oDA )
|
||||
|
||||
oWnd:show()
|
||||
|
||||
aMenu := Build_MenuBar( oWnd )
|
||||
aTool := Build_ToolBar( oWnd )
|
||||
oLabel := Build_Label( oDA, { 30,190 }, { 300, 30 } )
|
||||
aGrid := Build_Grid( oDA, { 30, 30 }, { 450,150 } )
|
||||
aTabs := Build_Tabs( oDA, { 510, 5 }, { 360, 400 } )
|
||||
oProg := Build_ProgressBar( oDA, { 30,300 }, { 200,30 } )
|
||||
aList := Build_ListBox( oDA, { 310,240 }, { 150, 100 } )
|
||||
oBtn := Build_PushButton( oDA, { 30,240 }, { 100,50 }, "CLOSE", "This dialog will be closed now!", @lExit )
|
||||
|
||||
oSBar := QStatusBar( oWnd )
|
||||
oWnd:setStatusBar( oSBar )
|
||||
oSBar:showMessage( "Harbour-QT Statusbar Ready!" )
|
||||
|
||||
oEventLoop := QEventLoop( oWnd )
|
||||
DO WHILE .t.
|
||||
oEventLoop:processEvents()
|
||||
IF lExit
|
||||
EXIT
|
||||
ENDIF
|
||||
ENDDO
|
||||
oEventLoop:exit( 0 )
|
||||
|
||||
xReleaseMemory( { oBtn, oLabel, oProg, oSBar, aGrid, aList, aMenu, aTool, aTabs, oDA, oWnd, oEventLoop } )
|
||||
HB_TRACE( HB_TR_DEBUG, " " )
|
||||
HB_TRACE( HB_TR_DEBUG, ".............. E X I T I N G one more dialog ..................." )
|
||||
HB_TRACE( HB_TR_DEBUG, " " )
|
||||
|
||||
RETURN
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
STATIC FUNCTION Build_MenuBar( oWnd )
|
||||
LOCAL oMenuBar, oMenu1, oMenu2
|
||||
LOCAL oActNew, oActOpen, oActSave, oActExit
|
||||
LOCAL oActColors, oActFonts, oActPgSetup, oActPreview, oActWiz, oActWeb, oActOther
|
||||
|
||||
oMenuBar := QMenuBar( oWnd )
|
||||
oMenuBar := oWnd:menuBar()
|
||||
|
||||
// F I L E
|
||||
oMenu1 := QMenu( oMenuBar )
|
||||
oMenu1:setTitle( "&File" )
|
||||
|
||||
@@ -229,40 +194,39 @@ STATIC FUNCTION Build_MenuBar( oWnd )
|
||||
|
||||
oMenuBar:addMenu( oMenu1 )
|
||||
|
||||
// D I A L O G S
|
||||
oMenu2 := QMenu( oMenuBar )
|
||||
oMenu2:setTitle( "&Dialogs" )
|
||||
|
||||
oActColors := oMenu2:addAction( "&Colors" )
|
||||
oActColors:connect( "triggered(bool)", {|w,l| Dialogs( "Colors", w, l ) } )
|
||||
oActColors:connect( "triggered(bool)", {|| Dialogs( "Colors", oWnd ) } )
|
||||
|
||||
oActFonts := oMenu2:addAction( "&Fonts" )
|
||||
oActFonts:connect( "triggered(bool)", {|w,l| Dialogs( "Fonts", w, l ) } )
|
||||
oActFonts:connect( "triggered(bool)", {|| Dialogs( "Fonts", oWnd ) } )
|
||||
|
||||
oMenu2:addSeparator()
|
||||
|
||||
oActPgSetup := oMenu2:addAction( "&PageSetup" )
|
||||
oActPgSetup:connect( "triggered(bool)", {|w,l| Dialogs( "PageSetup", w, l ) } )
|
||||
oActPgSetup:connect( "triggered(bool)", {|| Dialogs( "PageSetup", oWnd ) } )
|
||||
|
||||
oActPreview := oMenu2:addAction( "P&review" )
|
||||
oActPreview:connect( "triggered(bool)", {|w,l| Dialogs( "Preview", w, l ) } )
|
||||
oActPreview:connect( "triggered(bool)", {|| Dialogs( "Preview", oWnd ) } )
|
||||
|
||||
oMenu2:addSeparator()
|
||||
|
||||
oActWiz := oMenu2:addAction( "&Wizard" )
|
||||
oActWiz:connect( "triggered(bool)", {|w,l| Dialogs( "Wizard", w, l ) } )
|
||||
oActWiz:connect( "triggered(bool)", {|| Dialogs( "Wizard", oWnd ) } )
|
||||
|
||||
oActWeb := oMenu2:addAction( "W&ebPage" )
|
||||
oActWeb:connect( "triggered(bool)", {|w,l| Dialogs( "WebPage", w, l ) } )
|
||||
oActWeb:connect( "triggered(bool)", {|| Dialogs( "WebPage", oWnd ) } )
|
||||
|
||||
oMenu2:addSeparator()
|
||||
|
||||
oActOther := oMenu2:addAction( "&Another Dialog" )
|
||||
oActOther:connect( "triggered(bool)", {|| hb_threadStart( {|| ExecOneMore( oWnd ) } ) } )
|
||||
oActOther:connect( "triggered(bool)", {|| hb_threadStart( {|| ExecTheDialog( oWnd ) } ) } )
|
||||
|
||||
oMenuBar:addMenu( oMenu2 )
|
||||
|
||||
oWnd:setMenuBar( oMenuBar )
|
||||
|
||||
RETURN { oActNew, oActOpen, oActSave, oActExit, oActColors, oActFonts, ;
|
||||
oActPgSetup, oActPreview, oActWiz, oActWeb, oActOther }
|
||||
|
||||
@@ -366,9 +330,9 @@ STATIC FUNCTION Build_Tabs( oWnd, aPos, aSize )
|
||||
|
||||
oTabWidget := QTabWidget( oWnd )
|
||||
|
||||
oTab1 := QWidget()
|
||||
oTab2 := QWidget()
|
||||
oTab3 := QWidget()
|
||||
oTab1 := QWidget( oTabWidget )
|
||||
oTab2 := QWidget( oTabWidget )
|
||||
oTab3 := QWidget( oTabWidget )
|
||||
|
||||
oTabWidget:addTab( oTab1, "Folders" )
|
||||
oTabWidget:addTab( oTab2, "Controls" )
|
||||
@@ -385,21 +349,27 @@ STATIC FUNCTION Build_Tabs( oWnd, aPos, aSize )
|
||||
RETURN { aCtrls }
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
#if 1
|
||||
STATIC FUNCTION Build_TreeView( oWnd )
|
||||
LOCAL oTV, oDirModel
|
||||
HB_SYMBOL_UNUSED( oWnd )
|
||||
RETURN NIL
|
||||
#else
|
||||
STATIC FUNCTION Build_TreeView( oWnd )
|
||||
LOCAL oDirModel
|
||||
LOCAL oTV
|
||||
|
||||
oDirModel := QDirModel( oWnd )
|
||||
|
||||
oTV := QTreeView( oWnd )
|
||||
oTV:setMouseTracking( .t. )
|
||||
* oTV:connect( "hovered()", {|i| HB_TRACE( HB_TR_DEBUG, ( "oTV:hovered" ) } )
|
||||
oDirModel := QDirModel( oTV )
|
||||
// oTV:connect( "hovered()", {|i| HB_TRACE( HB_TR_DEBUG, ( "oTV:hovered" ) } )
|
||||
oTV:setModel( oDirModel )
|
||||
oTV:move( 5, 7 )
|
||||
oTV:resize( 345, 365 )
|
||||
OTV:show()
|
||||
|
||||
RETURN NIL
|
||||
|
||||
#endif
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
STATIC FUNCTION Build_ListBox( oWnd, aPos, aSize )
|
||||
@@ -553,6 +523,7 @@ STATIC FUNCTION Dialogs( cType, oParent )
|
||||
oDlg:setWindowTitle( "Harbour-QT Preview Dialog" )
|
||||
oDlg:exec()
|
||||
CASE cType == "Wizard"
|
||||
QMessageBox():critical( oParent, "XXX", "yyy" )
|
||||
oDlg := QWizard()
|
||||
oDlg:setWindowTitle( "Harbour-QT Wizard to Show Slides etc." )
|
||||
oDlg:exec()
|
||||
|
||||
Reference in New Issue
Block a user