2009-06-16 23:06 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)

* harbour/contrib/hbqt/hbqt.ch
  * harbour/contrib/hbqt/hbqt_slots.cpp
  * harbour/contrib/hbqt/hbqt_slots.h
  * harbour/contrib/hbqt/moc_slots.cpp
    ! Greatly improved SIGNAL/SLOT mechanism. 
      Now SIGNAL to SLOT connection is almost instant no matter how many
      widgets the application is employing.
    ! Implemented to relaase code blocks and reuse vacant slots. 
      It reduces the memory leakage considerably.

  * harbour/contrib/hbqt/tests/demoqt.prg
    ! Commented out non-available Signal/Slot pair reported by linus distro.
This commit is contained in:
Pritpal Bedi
2009-06-17 06:17:23 +00:00
parent 102d43358c
commit 56e816eefb
6 changed files with 464 additions and 364 deletions

View File

@@ -17,6 +17,20 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-06-16 23:06 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)
* harbour/contrib/hbqt/hbqt.ch
* harbour/contrib/hbqt/hbqt_slots.cpp
* harbour/contrib/hbqt/hbqt_slots.h
* harbour/contrib/hbqt/moc_slots.cpp
! Greatly improved SIGNAL/SLOT mechanism.
Now SIGNAL to SLOT connection is almost instant no matter how many
widgets the application is employing.
! Implemented to relaase code blocks and reuse vacant slots.
It reduces the memory leakage considerably.
* harbour/contrib/hbqt/tests/demoqt.prg
! Commented out non-available Signal/Slot pair reported by linus distro.
2009-06-17 00:05 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/contrib/hbwin/axcore.c
! fixed GPF on ActiveX application exit caused by invalid

View File

@@ -64,6 +64,9 @@
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
#ifndef _HBQT_CH
#define QEvent_None 0 // Not an event.
#define QEvent_AccessibilityDescription 130 // Used to query accessibility description texts (QAccessibleEvent).
#define QEvent_AccessibilityHelp 119 // Used to query accessibility help texts (QAccessibleEvent).
@@ -223,4 +226,22 @@
#define QPalette_LinkVisited 15 // A text color used for already visited hyperlinks. By default, the linkvisited color is Qt_magenta.
#define QPalette_NoRole 17 // No role; this special role is often used to indicate that a role has not been assigned.
#define QAbstractSlider_SliderNoAction 0
#define QAbstractSlider_SliderSingleStepAdd 1
#define QAbstractSlider_SliderSingleStepSub 2
#define QAbstractSlider_SliderPageStepAdd 3
#define QAbstractSlider_SliderPageStepSub 4
#define QAbstractSlider_SliderToMinimum 5
#define QAbstractSlider_SliderToMaximum 6
#define QAbstractSlider_SliderMove 7
#define QAbstractSlider_SliderRangeChange 0
#define QAbstractSlider_SliderOrientationChange 1
#define QAbstractSlider_SliderStepsChange 2
#define QAbstractSlider_SliderValueChange 3
/*----------------------------------------------------------------------*/
#define _HBQT_CH
#endif

View File

@@ -52,7 +52,6 @@
*/
/*----------------------------------------------------------------------*/
#include "hbapi.h"
#include "hbvm.h"
#include "hbapiitm.h"
@@ -61,6 +60,10 @@
#if QT_VERSION >= 0x040500
#if 0
#include <windows.h>
#endif
#include "hbqt_slots.h"
#include <QWidget>
@@ -69,128 +72,127 @@
#include <QKeyEvent>
#include <QAction>
#define HBQT_EVT_CLICKED 1
#define HBQT_EVT_TRIGGERED 2
#define HBQT_EVT_TRIGGERED_BOOL 3
#define HBQT_EVT_HOVERED 4
#define HBQT_EVT_STATECHANGED 5
#define HBQT_EVT_PRESSED 6
#define HBQT_EVT_RELEASED 7
/*----------------------------------------------------------------------*/
static Slots *s = NULL;
/*----------------------------------------------------------------------*/
static void SlotsExec( QWidget* widget, QString event, PHB_ITEM pItem )
{
for( int i = 0; i < s->list1.size(); ++i )
{
if( ( QWidget* ) s->list1.at( i ) == widget )
{
if( ( ( QString ) s->list2.at( i ) == event ) && ( ( bool ) s->list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget* ) widget );
hb_vmEvalBlockV( ( PHB_ITEM ) s->list3.at( i ), 1, pWidget );
hb_itemRelease( pWidget );
}
}
}
if( pItem != NULL )
{
hb_itemRelease( pItem );
}
}
static void SlotsExecAction( QAction* widget, QString event, PHB_ITEM pItem )
{
for( int i = 0; i < s->list1.size(); ++i )
{
if( ( QAction* ) s->list5.at( i ) == widget )
{
if( ( ( QString ) s->list2.at( i ) == event ) && ( ( bool ) s->list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QAction* ) widget );
hb_vmEvalBlockV( ( PHB_ITEM ) s->list3.at( i ), 1, pWidget );
hb_itemRelease( pWidget );
}
}
}
if( pItem != NULL )
{
hb_itemRelease( pItem );
}
}
static void SlotsExecInt( QWidget* widget, QString event, PHB_ITEM pItem, int iValue )
{
for( int i = 0; i < s->list1.size(); ++i )
{
if( ( QWidget* ) s->list1.at( i ) == widget )
{
if( ( ( QString ) s->list2.at( i ) == event ) && ( ( bool ) s->list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget* ) widget );
PHB_ITEM pState = hb_itemPutNI( NULL, iValue );
hb_vmEvalBlockV( ( PHB_ITEM ) s->list3.at( i ), 2, pWidget, pState );
hb_itemRelease( pWidget );
hb_itemRelease( pState );
}
}
}
if( pItem != NULL )
{
hb_itemRelease( pItem );
}
}
static void SlotsExecModel( QWidget* widget, QString event, PHB_ITEM pItem, const QModelIndex & index )
{
for( int i = 0; i < s->list1.size(); ++i )
{
if( ( QWidget* ) s->list1.at( i ) == widget )
{
if( ( ( QString ) s->list2.at( i ) == event ) && ( ( bool ) s->list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget* ) widget );
PHB_ITEM pState = hb_itemPutPtr( NULL, ( QModelIndex * ) new QModelIndex( index ) );
hb_vmEvalBlockV( ( PHB_ITEM ) s->list3.at( i ), 2, pWidget, pState );
hb_itemRelease( pWidget );
hb_itemRelease( pState );
}
}
}
if( pItem != NULL )
{
hb_itemRelease( pItem );
}
}
Slots::Slots( QObject* parent ) : QObject( parent )
{
}
Slots::~Slots()
{
}
static void SlotsExec( QWidget* widget, char* event )
{
if( widget )
{
int i = widget->property( event ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget* ) widget );
hb_vmEvalBlockV( ( PHB_ITEM ) s->listBlock.at( i-1 ), 1, pWidget );
hb_itemRelease( pWidget );
}
}
}
static void SlotsExecAction( QAction* widget, char* event )
{
if( widget )
{
int i = widget->property( event ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QAction* ) widget );
hb_vmEvalBlockV( ( PHB_ITEM ) s->listBlock.at( i-1 ), 1, pWidget );
hb_itemRelease( pWidget );
}
}
}
static void SlotsExecInt( QWidget* widget, char* event, int iValue )
{
if( widget )
{
int i = widget->property( event ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget* ) widget );
PHB_ITEM pState = hb_itemPutNI( NULL, iValue );
hb_vmEvalBlockV( ( PHB_ITEM ) s->listBlock.at( i-1 ), 2, pWidget, pState );
hb_itemRelease( pWidget );
hb_itemRelease( pState );
}
}
}
static void SlotsExecIntInt( QWidget* widget, char* event, int iValue1, int iValue2 )
{
if( widget )
{
int i = widget->property( event ).toInt();
if( i > 0 && ( s->listActv.at( i-1 ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget* ) widget );
PHB_ITEM pValue1 = hb_itemPutNI( NULL, iValue1 );
PHB_ITEM pValue2 = hb_itemPutNI( NULL, iValue2 );
hb_vmEvalBlockV( ( PHB_ITEM ) s->listBlock.at( i-1 ), 3, pWidget, pValue1, pValue2 );
hb_itemRelease( pWidget );
hb_itemRelease( pValue1 );
hb_itemRelease( pValue2 );
}
}
}
static void SlotsExecModel( QWidget* widget, char* event, const QModelIndex & index )
{
if( widget )
{
int i = widget->property( event ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget* ) widget );
PHB_ITEM pState = hb_itemPutPtr( NULL, ( QModelIndex * ) new QModelIndex( index ) );
hb_vmEvalBlockV( ( PHB_ITEM ) s->listBlock.at( i-1 ), 2, pWidget, pState );
hb_itemRelease( pWidget );
hb_itemRelease( pState );
}
}
}
static void SlotsExecMouseEvent( QWidget* widget, char* event, QMouseEvent* mevent )
{
if( widget )
{
int i = widget->property( event ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, mevent );
hb_vmEvalBlockV( ( PHB_ITEM ) s->listBlock.at( i-1 ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
}
}
bool Slots::event( QEvent * event )
{
bool bAccepted = true;
QObject *widget = qobject_cast<QObject *>( sender() );
for( int i = 0; i < list1.size(); ++i )
if( widget )
{
if( ( QObject* ) list1.at( i ) == ( QObject* ) widget )
int i = widget->property( "event()" ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
if( ( ( QString ) list2.at( i ) == ( QString ) "event()" ) && ( ( bool ) list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, event );
bAccepted = hb_vmEvalBlockV( ( PHB_ITEM ) list3.at( i ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, event );
bAccepted = hb_vmEvalBlockV( ( PHB_ITEM ) listBlock.at( i-1 ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
}
return bAccepted;
@@ -199,37 +201,33 @@ bool Slots::event( QEvent * event )
void Slots::keyPressEvent( QKeyEvent * event )
{
QObject *widget = qobject_cast<QObject *>( sender() );
for( int i = 0; i < list1.size(); ++i )
if( widget )
{
if( ( QObject* ) list1.at( i ) == ( QObject* ) widget )
int i = widget->property( "keyPressEvent()" ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
if( ( ( QString ) list2.at( i ) == ( QString ) "keyPressEvent()" ) && ( ( bool ) list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, event );
hb_vmEvalBlockV( ( PHB_ITEM ) list3.at( i ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, event );
hb_vmEvalBlockV( ( PHB_ITEM ) listBlock.at( i-1 ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
}
}
void Slots::mouseMoveEvent( QMouseEvent * event )
void Slots::triggered( bool checked )
{
QObject *widget = qobject_cast<QObject *>( sender() );
for( int i = 0; i < list1.size(); ++i )
if( widget )
{
if( ( QObject* ) list1.at( i ) == ( QObject* ) widget )
int i = widget->property( "triggered(bool)" ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
if( ( ( QString ) list2.at( i ) == ( QString ) "mouseMoveEvent()" ) && ( ( bool ) list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, event );
hb_vmEvalBlockV( ( PHB_ITEM ) list3.at( i ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QObject * ) widget );
PHB_ITEM pChecked = hb_itemPutL( NULL, checked );
hb_vmEvalBlockV( ( PHB_ITEM ) listBlock.at( i-1 ), 2, pWidget, pChecked );
hb_itemRelease( pWidget );
hb_itemRelease( pChecked );
}
}
}
@@ -237,132 +235,133 @@ void Slots::mouseMoveEvent( QMouseEvent * event )
void Slots::hovered( QAction * action )
{
QObject *widget = qobject_cast<QObject *>( sender() );
for( int i = 0; i < list1.size(); ++i )
if( widget )
{
if( ( QObject* ) list1.at( i ) == ( QObject* ) widget )
int i = widget->property( "hovered(action)" ).toInt();
if( ( i > 0 ) && ( s->listActv.at( i-1 ) == true ) )
{
if( ( ( QString ) list2.at( i ) == ( QString ) "hovered(action)" ) && ( ( bool ) list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, action );
hb_vmEvalBlockV( ( PHB_ITEM ) list3.at( i ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QWidget * ) widget );
PHB_ITEM pEvent = hb_itemPutPtr( NULL, action );
hb_vmEvalBlockV( ( PHB_ITEM ) listBlock.at( i-1 ), 2, pWidget, pEvent );
hb_itemRelease( pWidget );
hb_itemRelease( pEvent );
}
}
}
void Slots::mouseMoveEvent( QMouseEvent * event )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecMouseEvent( widget, ( char* ) "mouseMoveEvent()", event );
}
void Slots::clicked()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( QString ) "clicked()", NULL );
SlotsExec( widget, ( char* ) "clicked()" );
}
void Slots::returnPressed()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( QString ) "returnPressed()", NULL );
SlotsExec( widget, ( char* ) "returnPressed()" );
}
void Slots::viewportEntered()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( QString ) "viewportEntered()", NULL );
SlotsExec( widget, ( char* ) "viewportEntered()" );
}
void Slots::pressed()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( QString ) "pressed()", NULL );
SlotsExec( widget, ( char* ) "pressed()" );
}
void Slots::released()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( QString ) "released()", NULL );
SlotsExec( widget, ( char* ) "released()" );
}
void Slots::hovered()
{
//QWidget *widget = qobject_cast<QWidget *>( sender() );
QAction *widget = qobject_cast<QAction *>( sender() );
if( widget )
{
SlotsExecAction( widget, ( QString ) "hovered()", NULL );
}
}
void Slots::triggered()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( QString ) "triggered()", NULL );
SlotsExec( widget, ( char* ) "triggered()" );
}
void Slots::triggered( bool checked )
void Slots::hovered()
{
QObject *widget = qobject_cast<QObject *>( sender() );
for( int i = 0; i < list1.size(); ++i )
{
if( ( QObject* ) list1.at( i ) == ( QObject* ) widget )
{
if( ( ( QString ) list2.at( i ) == ( QString ) "triggered(bool)" ) && ( ( bool ) list4.at( i ) == true ) )
{
PHB_ITEM pWidget = hb_itemPutPtr( NULL, ( QObject * ) widget );
PHB_ITEM pChecked = hb_itemPutL( NULL, checked );
hb_vmEvalBlockV( ( PHB_ITEM ) list3.at( i ), 2, pWidget, pChecked );
hb_itemRelease( pWidget );
hb_itemRelease( pChecked );
}
}
}
QAction *widget = qobject_cast<QAction *>( sender() );
SlotsExecAction( widget, ( char* ) "hovered()" );
}
void Slots::stateChanged( int state )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( QString ) "stateChanged(int)", NULL, state );
SlotsExecInt( widget, ( char* ) "stateChanged(int)", state );
}
void Slots::activated( int index )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( QString ) "activated(int)", NULL, index );
SlotsExecInt( widget, ( char* ) "activated(int)", index );
}
void Slots::currentIndexChanged( int index )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( QString ) "currentIndexChanged(int)", NULL, index );
SlotsExecInt( widget, ( char* ) "currentIndexChanged(int)", index );
}
void Slots::currentChanged( int index )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( QString ) "currentChanged(int)", NULL, index );
SlotsExecInt( widget, ( char* ) "currentChanged(int)", index );
}
void Slots::highlighted( int index )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( QString ) "highlighted(int)", NULL, index );
SlotsExecInt( widget, ( char* ) "highlighted(int)", index );
}
void Slots::clicked( const QModelIndex & index )
{
QWidget * widget = qobject_cast<QWidget *>( sender() );
SlotsExecModel( widget, ( QString ) "clicked(QModelIndex)", NULL, index );
SlotsExecModel( widget, ( char* ) "clicked(QModelIndex)", index );
}
void Slots::doubleClicked( const QModelIndex & index )
{
QWidget * widget = qobject_cast<QWidget *>( sender() );
SlotsExecModel( widget, ( QString ) "doubleClicked(QModelIndex)", NULL, index );
SlotsExecModel( widget, ( char* ) "doubleClicked(QModelIndex)", index );
}
void Slots::entered( const QModelIndex & index )
{
QWidget * widget = qobject_cast<QWidget *>( sender() );
SlotsExecModel( widget, ( QString ) "entered(QModelIndex)", NULL, index );
SlotsExecModel( widget, ( char* ) "entered(QModelIndex)", index );
}
void Slots::actionTriggered( int action )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( char* ) "actionTriggered(int)", action );
}
void Slots::rangeChanged( int min, int max )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecIntInt( widget, ( char* ) "rangeChanged(int)", min, max );
}
void Slots::sliderMoved( int value )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( char* ) "sliderMoved(int)", value );
}
void Slots::sliderPressed()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( char* ) "sliderPressed()" );
}
void Slots::sliderReleased()
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExec( widget, ( char* ) "sliderReleased()" );
}
void Slots::valueChanged( int value )
{
QWidget *widget = qobject_cast<QWidget *>( sender() );
SlotsExecInt( widget, ( char* ) "valueChanged(int)", value );
}
/*
@@ -374,20 +373,12 @@ HB_FUNC( QT_CONNECT_SIGNAL )
QString signal = hb_parc( 2 ); /* get signal */
PHB_ITEM codeblock = hb_itemNew( hb_param( 3, HB_IT_BLOCK | HB_IT_BYREF ) ); /* get codeblock */
bool ret = false; /* return value */
bool bAct = false;
/* create object s, if not created yet */
if( s == NULL )
{
s = new Slots();
}
/* connect signal with slot
* if the list become to long, more classes can be created
* TODO: parameter Qt::AutoConnection
*/
/* Events with no parameters */
if( signal == ( QString ) "clicked()" )
{
ret = widget->connect( widget, SIGNAL( clicked() ) , s, SLOT( clicked() ) , Qt::AutoConnection );
@@ -403,7 +394,6 @@ HB_FUNC( QT_CONNECT_SIGNAL )
if( signal == ( QString ) "hovered()" )
{
ret = widget->connect( widget, SIGNAL( hovered() ) , s, SLOT( hovered() ) , Qt::AutoConnection );
bAct = true;
}
if( signal == ( QString ) "viewportEntered()" )
{
@@ -418,7 +408,6 @@ HB_FUNC( QT_CONNECT_SIGNAL )
ret = widget->connect( widget, SIGNAL( released() ) ,
s, SLOT( released() ), Qt::AutoConnection );
}
/* Events with int parameter */
if( signal == ( QString ) "stateChanged(int)" )
{
ret = widget->connect( widget, SIGNAL( stateChanged( int ) ),
@@ -439,13 +428,11 @@ HB_FUNC( QT_CONNECT_SIGNAL )
ret = widget->connect( widget, SIGNAL( highlighted( int ) ) ,
s, SLOT( highlighted( int ) ) , Qt::AutoConnection );
}
/* Events with bool parameter */
if( signal == ( QString ) "triggered(bool)" )
{
ret = widget->connect( widget, SIGNAL( triggered( bool ) ),
s, SLOT( triggered( bool ) ) , Qt::AutoConnection );
}
/* Events with miscellaneous parameters */
if( signal == ( QString ) "clicked(QModelIndex)" )
{
ret = widget->connect( widget, SIGNAL( clicked( const QModelIndex & ) ),
@@ -486,60 +473,114 @@ HB_FUNC( QT_CONNECT_SIGNAL )
ret = widget->connect( widget, SIGNAL( currentChanged( int ) ),
s, SLOT( currentChanged( int ) ), Qt::AutoConnection );
}
if( signal == ( QString ) "actionTriggered(int)" )
{
ret = widget->connect( widget, SIGNAL( actionTriggered(int) ),
s, SLOT( actionTriggered(int) ), Qt::AutoConnection );
}
if( signal == ( QString ) "rangeChanged(int,int)" )
{
ret = widget->connect( widget, SIGNAL( rangeChanged(int,int) ),
s, SLOT( rangeChanged(int,int) ), Qt::AutoConnection );
}
if( signal == ( QString ) "sliderMoved(int)" )
{
ret = widget->connect( widget, SIGNAL( sliderMoved(int) ),
s, SLOT( sliderMoved(int) ), Qt::AutoConnection );
}
if( signal == ( QString ) "sliderPressed()" )
{
ret = widget->connect( widget, SIGNAL( sliderPressed() ),
s, SLOT( sliderPressed() ), Qt::AutoConnection );
}
if( signal == ( QString ) "sliderReleased()" )
{
ret = widget->connect( widget, SIGNAL( sliderReleased() ),
s, SLOT( sliderReleased() ), Qt::AutoConnection );
}
if( signal == ( QString ) "valueChanged(int)" )
{
ret = widget->connect( widget, SIGNAL( valueChanged(int) ),
s, SLOT( valueChanged(int) ), Qt::AutoConnection );
}
/* return connect result */
hb_retl( ret );
/* if connected: store widget, signal, codeblock and flag
* TODO: locate a inactive entry and use it
*/
if( ret == true )
{
if( bAct )
bool bFound = false;
int i;
for( i = 0; i < s->listBlock.size(); i++ )
{
s->list5 << ( QAction* ) hb_parptr( 1 );
s->list1 << NULL;
if( s->listBlock.at( i ) == NULL )
{
bFound = true;
break;
}
}
if( bFound )
{
s->listBlock[ i ] = codeblock;
s->listActv[ i ] = true;
widget->setProperty( hb_parc( 2 ), ( int ) i+1 );
}
else
{
s->list5 << NULL;
s->list1 << widget;
s->listBlock << codeblock;
s->listActv << true;
widget->setProperty( hb_parc( 2 ), ( int ) s->listBlock.size() );
}
s->list2 << signal;
s->list3 << codeblock;
s->list4 << true;
}
}
/*
* harbour function to disconnect signals
*/
HB_FUNC( QT_DISCONNECT_SIGNAL )
{
/* TODO */
QWidget * widget = ( QWidget* ) hb_parptr( 1 );
if( widget )
{
char * event = hb_parc( 2 );
int i = widget->property( event ).toInt();
if( i > 0 && i <= s->listBlock.size() )
{
if( s->listBlock.at( i-1 ) != NULL )
{
#if 0
char buf[40];
sprintf( buf, "signal %i : %s", i, event );
OutputDebugString( buf );
#endif
hb_itemRelease( s->listBlock.at( i-1 ) );
s->listBlock[ i-1 ] = NULL;
s->listActv[ i-1 ] = false;
}
}
}
}
/*
* harbour function to release all codeblocks storeds
*/
#if 0
HB_FUNC( RELEASE_CODEBLOCKS )
{
if( s )
{
for( int i = 0; i < s->list1.size(); ++i )
for( int i = 0; i < s->listBlock.size(); ++i )
{
if( ( bool ) s->list4.at( i ) == true )
if( ( bool ) s->listActv.at( i ) == true )
{
hb_itemRelease( ( PHB_ITEM ) s->list3.at( i ) );
hb_itemRelease( ( PHB_ITEM ) s->listBlock.at( i ) );
s->listBlock[ i ] = NULL;
s->listActv[ i ] = false;
}
}
}
}
#endif
/*
* C function to release all codeblocks storeds
@@ -550,11 +591,11 @@ void release_codeblocks( void )
{
if( s )
{
for( int i = 0; i < s->list1.size(); ++i )
for( int i = 0; i < s->listBlock.size(); ++i )
{
if( ( bool ) s->list4.at( i ) == true )
if( ( bool ) s->listActv.at( i ) == true )
{
hb_itemRelease( ( PHB_ITEM ) s->list3.at( i ) );
hb_itemRelease( ( PHB_ITEM ) s->listBlock.at( i ) );
}
}
}

View File

@@ -65,10 +65,45 @@
#include <QKeyEvent>
#include <QMouseEvent>
#include "hbapi.h"
#include "hbapiitm.h"
/*----------------------------------------------------------------------*/
class MyDrawingArea : public QWidget
{
Q_OBJECT
public:
MyDrawingArea( QWidget *parent = 0 );
virtual ~MyDrawingArea( void );
void keyPressEvent( QKeyEvent * event );
void mouseMoveEvent( QMouseEvent * event );
signals:
void sg_mouseMoveEvent( QMouseEvent * event );
void sg_keyPressEvent( QKeyEvent * event );
};
/*----------------------------------------------------------------------*/
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow();
virtual ~MyMainWindow();
public:
void closeEvent( QCloseEvent *event );
};
/*----------------------------------------------------------------------*/
class Slots: public QObject
{
Q_OBJECT
@@ -76,11 +111,8 @@ class Slots: public QObject
public:
Slots( QObject *parent = 0 );
~Slots();
QList<QWidget*> list1;
QList<QAction*> list5;
QList<QString> list2;
QList<PHB_ITEM> list3;
QList<bool> list4;
QList<PHB_ITEM> listBlock;
QList<bool> listActv;
public slots:
void clicked();
@@ -103,40 +135,16 @@ public slots:
void mouseMoveEvent( QMouseEvent * event );
void hovered( QAction * action );
void currentChanged( int index );
/* Slots to handle sliders */
void actionTriggered( int action );
void rangeChanged( int min, int max );
void sliderMoved( int value );
void sliderPressed();
void sliderReleased();
void valueChanged( int value );
};
class MyDrawingArea : public QWidget
{
Q_OBJECT
public:
MyDrawingArea( QWidget *parent = 0 );
virtual ~MyDrawingArea( void );
void keyPressEvent( QKeyEvent * event );
void mouseMoveEvent( QMouseEvent * event );
signals:
void sg_mouseMoveEvent( QMouseEvent * event );
void sg_keyPressEvent( QKeyEvent * event );
};
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow();
virtual ~MyMainWindow();
public:
void closeEvent( QCloseEvent *event );
};
/*----------------------------------------------------------------------*/
#endif

View File

@@ -1,7 +1,7 @@
/****************************************************************************
** Meta object code from reading C++ file 'hbqt_slots.h'
**
** Created: Mon Jun 15 13:08:25 2009
** Created: Tue Jun 16 15:09:19 2009
** by: The Qt Meta Object Compiler version 61 (Qt 4.5.0)
**
** WARNING! All changes made in this file will be lost!
@@ -17,108 +17,6 @@
#endif
QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_Slots[] = {
// content:
2, // revision
0, // classname
0, 0, // classinfo
20, 12, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
// slots: signature, parameters, type, tag, flags
7, 6, 6, 6, 0x0a,
17, 6, 6, 6, 0x0a,
37, 29, 6, 6, 0x0a,
53, 6, 6, 6, 0x0a,
69, 63, 6, 6, 0x0a,
87, 6, 6, 6, 0x0a,
97, 6, 6, 6, 0x0a,
114, 108, 6, 6, 0x0a,
129, 108, 6, 6, 0x0a,
154, 108, 6, 6, 0x0a,
171, 6, 6, 6, 0x0a,
187, 108, 6, 6, 0x0a,
208, 108, 6, 6, 0x0a,
235, 108, 6, 6, 0x0a,
256, 6, 6, 6, 0x0a,
285, 279, 274, 6, 0x0a,
300, 279, 6, 6, 0x0a,
326, 279, 6, 6, 0x0a,
362, 355, 6, 6, 0x0a,
380, 108, 6, 6, 0x0a,
0 // eod
};
static const char qt_meta_stringdata_Slots[] = {
"Slots\0\0clicked()\0triggered()\0checked\0"
"triggered(bool)\0hovered()\0state\0"
"stateChanged(int)\0pressed()\0released()\0"
"index\0activated(int)\0currentIndexChanged(int)\0"
"highlighted(int)\0returnPressed()\0"
"clicked(QModelIndex)\0doubleClicked(QModelIndex)\0"
"entered(QModelIndex)\0viewportEntered()\0"
"bool\0event\0event(QEvent*)\0"
"keyPressEvent(QKeyEvent*)\0"
"mouseMoveEvent(QMouseEvent*)\0action\0"
"hovered(QAction*)\0currentChanged(int)\0"
};
const QMetaObject Slots::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_Slots,
qt_meta_data_Slots, 0 }
};
const QMetaObject *Slots::metaObject() const
{
return &staticMetaObject;
}
void *Slots::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_Slots))
return static_cast<void*>(const_cast< Slots*>(this));
return QObject::qt_metacast(_clname);
}
int Slots::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QObject::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: clicked(); break;
case 1: triggered(); break;
case 2: triggered((*reinterpret_cast< bool(*)>(_a[1]))); break;
case 3: hovered(); break;
case 4: stateChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
case 5: pressed(); break;
case 6: released(); break;
case 7: activated((*reinterpret_cast< int(*)>(_a[1]))); break;
case 8: currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
case 9: highlighted((*reinterpret_cast< int(*)>(_a[1]))); break;
case 10: returnPressed(); break;
case 11: clicked((*reinterpret_cast< const QModelIndex(*)>(_a[1]))); break;
case 12: doubleClicked((*reinterpret_cast< const QModelIndex(*)>(_a[1]))); break;
case 13: entered((*reinterpret_cast< const QModelIndex(*)>(_a[1]))); break;
case 14: viewportEntered(); break;
case 15: { bool _r = event((*reinterpret_cast< QEvent*(*)>(_a[1])));
if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; } break;
case 16: keyPressEvent((*reinterpret_cast< QKeyEvent*(*)>(_a[1]))); break;
case 17: mouseMoveEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break;
case 18: hovered((*reinterpret_cast< QAction*(*)>(_a[1]))); break;
case 19: currentChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
default: ;
}
_id -= 20;
}
return _id;
}
static const uint qt_meta_data_MyDrawingArea[] = {
// content:
@@ -233,4 +131,122 @@ int MyMainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
return _id;
return _id;
}
static const uint qt_meta_data_Slots[] = {
// content:
2, // revision
0, // classname
0, 0, // classinfo
26, 12, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
// slots: signature, parameters, type, tag, flags
7, 6, 6, 6, 0x0a,
17, 6, 6, 6, 0x0a,
37, 29, 6, 6, 0x0a,
53, 6, 6, 6, 0x0a,
69, 63, 6, 6, 0x0a,
87, 6, 6, 6, 0x0a,
97, 6, 6, 6, 0x0a,
114, 108, 6, 6, 0x0a,
129, 108, 6, 6, 0x0a,
154, 108, 6, 6, 0x0a,
171, 6, 6, 6, 0x0a,
187, 108, 6, 6, 0x0a,
208, 108, 6, 6, 0x0a,
235, 108, 6, 6, 0x0a,
256, 6, 6, 6, 0x0a,
285, 279, 274, 6, 0x0a,
300, 279, 6, 6, 0x0a,
326, 279, 6, 6, 0x0a,
362, 355, 6, 6, 0x0a,
380, 108, 6, 6, 0x0a,
400, 355, 6, 6, 0x0a,
429, 421, 6, 6, 0x0a,
457, 451, 6, 6, 0x0a,
474, 6, 6, 6, 0x0a,
490, 6, 6, 6, 0x0a,
507, 451, 6, 6, 0x0a,
0 // eod
};
static const char qt_meta_stringdata_Slots[] = {
"Slots\0\0clicked()\0triggered()\0checked\0"
"triggered(bool)\0hovered()\0state\0"
"stateChanged(int)\0pressed()\0released()\0"
"index\0activated(int)\0currentIndexChanged(int)\0"
"highlighted(int)\0returnPressed()\0"
"clicked(QModelIndex)\0doubleClicked(QModelIndex)\0"
"entered(QModelIndex)\0viewportEntered()\0"
"bool\0event\0event(QEvent*)\0"
"keyPressEvent(QKeyEvent*)\0"
"mouseMoveEvent(QMouseEvent*)\0action\0"
"hovered(QAction*)\0currentChanged(int)\0"
"actionTriggered(int)\0min,max\0"
"rangeChanged(int,int)\0value\0"
"sliderMoved(int)\0sliderPressed()\0"
"sliderReleased()\0valueChanged(int)\0"
};
const QMetaObject Slots::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_Slots,
qt_meta_data_Slots, 0 }
};
const QMetaObject *Slots::metaObject() const
{
return &staticMetaObject;
}
void *Slots::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_Slots))
return static_cast<void*>(const_cast< Slots*>(this));
return QObject::qt_metacast(_clname);
}
int Slots::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QObject::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: clicked(); break;
case 1: triggered(); break;
case 2: triggered((*reinterpret_cast< bool(*)>(_a[1]))); break;
case 3: hovered(); break;
case 4: stateChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
case 5: pressed(); break;
case 6: released(); break;
case 7: activated((*reinterpret_cast< int(*)>(_a[1]))); break;
case 8: currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
case 9: highlighted((*reinterpret_cast< int(*)>(_a[1]))); break;
case 10: returnPressed(); break;
case 11: clicked((*reinterpret_cast< const QModelIndex(*)>(_a[1]))); break;
case 12: doubleClicked((*reinterpret_cast< const QModelIndex(*)>(_a[1]))); break;
case 13: entered((*reinterpret_cast< const QModelIndex(*)>(_a[1]))); break;
case 14: viewportEntered(); break;
case 15: { bool _r = event((*reinterpret_cast< QEvent*(*)>(_a[1])));
if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; } break;
case 16: keyPressEvent((*reinterpret_cast< QKeyEvent*(*)>(_a[1]))); break;
case 17: mouseMoveEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break;
case 18: hovered((*reinterpret_cast< QAction*(*)>(_a[1]))); break;
case 19: currentChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
case 20: actionTriggered((*reinterpret_cast< int(*)>(_a[1]))); break;
case 21: rangeChanged((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break;
case 22: sliderMoved((*reinterpret_cast< int(*)>(_a[1]))); break;
case 23: sliderPressed(); break;
case 24: sliderReleased(); break;
case 25: valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
default: ;
}
_id -= 26;
}
return _id;
}
QT_END_MOC_NAMESPACE

View File

@@ -338,7 +338,7 @@ STATIC FUNCTION Build_TreeView( oWnd )
oTV := QTreeView():new( QT_PTROF( oWnd ) )
oTV:setMouseTracking( .t. )
Qt_Connect_Signal( QT_PTROF( oTV ), QT_EVE_HOVERED, {|o,i| uiDebug( "oTV:hovered" ) } )
//Qt_Connect_Signal( QT_PTROF( oTV ), QT_EVE_HOVERED, {|o,i| uiDebug( "oTV:hovered" ) } )
oDirModel := QDirModel():new( QT_PTROF( oTV ) )
oTV:setModel( QT_PTROF( oDirModel ) )
oTV:move( 5, 7 )
@@ -354,7 +354,7 @@ STATIC FUNCTION Build_ListBox( oWnd, aPos, aSize )
oListBox := QListView():New( QT_PTROF( oWnd ) )
oListBox:setMouseTracking( .t. )
Qt_Connect_Signal( QT_PTROF( oListBox ), QT_EVE_HOVERED, {|o,i| uiDebug( "oListBox:hovered" ) } )
//Qt_Connect_Signal( QT_PTROF( oListBox ), QT_EVE_HOVERED, {|o,i| uiDebug( "oListBox:hovered" ) } )
oStrList := QStringList():new( QT_PTROF( oListBox ) )