2012-08-16 18:52 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)

+ contrib/hbqt/tests/browarray.prg
    + Added: an array browser which also allows to add data rows 
       to the existing array. This facilitates the understanding 
       of HBQAbstractItemModel()'s internal working. This commit 
       answers to many question posted in the mailing-list and 
       also directed to my mail-box.
This commit is contained in:
Pritpal Bedi
2012-08-17 01:55:52 +00:00
parent cfb59dc270
commit 7e41002aa1
2 changed files with 261 additions and 0 deletions

View File

@@ -16,6 +16,14 @@
The license applies to all entries newer than 2009-04-28.
*/
2012-08-16 18:52 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
+ contrib/hbqt/tests/browarray.prg
+ Added: an array browser which also allows to add data rows
to the existing array. This facilitates the understanding
of HBQAbstractItemModel()'s internal working. This commit
answers to many question posted in the mailing-list and
also directed to my mail-box.
2012-08-15 15:55 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/edit.prg
! Fixed: a nasty side-effect of pair-matching; weired editing behaviour.

View File

@@ -0,0 +1,253 @@
/*
* $Id$
*/
/*
* Harbour Project source code:
*
* Copyright 2010 Carlos Bacco <carlosbacco at gmail.com>
* www - http://harbour-project.org
*
*/
#include "hbqtgui.ch"
#include "hbtrace.ch"
#include "common.ch"
STATIC oSize
STATIC nCX
STATIC nCY
STATIC aData
STATIC oColorC
STATIC oColorN
STATIC oColorD
STATIC oColorLY
STATIC oColorLN
#define _method_local_
PROCEDURE Main()
LOCAL tb1, mo1, lay1, lay2, bt1, bt2, bt3, hd1, i
LOCAL oWnd, oDA, aStruct
#ifdef _method_local_
LOCAL oID, oSM
#endif
hbqt_errorsys()
SET DATE ANSI
SET CENTURY ON
oColorN := QColor( 100, 0,100 )
oColorD := QColor( 150, 100, 0 )
oColorLY:= QColor( 0, 150, 0 )
oColorLN:= QColor( 200, 0, 0 )
aStruct := {}
AAdd( aStruct, { "Name" , "C", 8, 0 } )
AAdd( aStruct, { "DOB" , "D", 8, 0 } )
AAdd( aStruct, { "PAY" , "N", 5, 0 } )
AAdd( aStruct, { "MARRIED", "L", 1, 0 } )
aData := {}
AAdd( aData, { "Andy" , SToD( "20120525" ), 200, .T. } )
AAdd( aData, { "Tomy" , SToD( "20120617" ), 300, .F. } )
AAdd( aData, { "Zindal", SToD( "20121213" ), 100, .F. } )
oWnd := QMainWindow()
oWnd:resize(640,460 )
oDA := QWidget()
oWnd:setCentralWidget( oDA )
lay1 := QVBoxLayout( oDA )
nCX := 0
nCY := 0
tb1 := QTableView()
mo1 := HBQAbstractItemModel( {| t, r, x, y| my_browse( aStruct, t, r, x, y ) } )
tb1:setModel( mo1 )
#ifdef _method_local_
oID := tb1:itemDelegate()
oID:connect( "commitData(QWidget*)", {| w | my_save( w, aStruct, @nCX, @nCY ) } )
oSM := tb1:selectionModel()
oSM:connect( "currentChanged(QModelIndex,QModelIndex)", {| n | my_select( n, @nCX, @nCY ) } )
#else
connect( tb1, aStruct, @nCX, @nCY )
#endif
hd1 := tb1:horizontalHeader()
FOR i := 1 To Len( aStruct )
hd1:resizeSection( i - 1, aStruct[ i, 3 ] * 6 + 60 )
NEXT
tb1:verticalHeader():setDefaultSectionSize( 24 )
oSize := QSize(50,24)
lay1:addWidget( tb1 )
lay2 := QHBoxLayout()
lay1:addlayout( lay2 )
( bt1 := QPushButton() ):SetText( "Add Row" )
bt1:connect( "clicked()", {|| my_addRow( mo1 ) } )
( bt2 := QPushButton() ):SetText( "Dummy 2" )
( bt3 := QPushButton() ):SetText( "Dummy 3" )
lay2:addWidget( bt1 )
lay2:addStretch()
lay2:addWidget( bt2 )
lay2:addWidget( bt3 )
oWnd:Show()
QApplication():exec()
RETURN
STATIC PROCEDURE my_save( qWidget, aStru, nCX, nCY )
LOCAL cData := qWidget:property( "text" ):toString()
LOCAL nRow := nCY + 1
LOCAL nCol := nCX + 1
SWITCH aStru[ nCol, 2 ]
CASE "C"
aData[ nRow, nCol ] := AllTrim( cData )
EXIT
CASE "N"
aData[ nRow, nCol ] := Val( cData )
EXIT
CASE "L"
aData[ nRow, nCol ] := Left( cData, 1 ) $ "YyTt"
EXIT
CASE "D"
aData[ nRow, nCol ] := CToD( cData )
EXIT
ENDSWITCH
RETURN
STATIC PROCEDURE my_select( qModelIndex, nCX, nCY )
nCX := qModelIndex:column()
nCY := qModelIndex:row()
RETURN
STATIC FUNCTION my_browse( aStru, t, role, nX, nY )
LOCAL nRow := nY + 1 /* Harbour array is 1 based */
LOCAL nCol := nX + 1
SWITCH t
CASE HBQT_QAIM_flags
RETURN Qt_ItemIsEnabled + Qt_ItemIsSelectable + Qt_ItemIsEditable;
CASE HBQT_QAIM_data
SWITCH role
CASE Qt_DisplayRole
SWITCH aStru[ nCol, 2 ]
CASE "C"
RETURN AllTrim( aData[ nRow, nCol ] )
CASE "N"
RETURN hb_ntos( aData[ nRow, nCol ] )
CASE "L"
RETURN iif( aData[ nRow, nCol ], "Yes", "No" )
CASE "D"
RETURN DToC( aData[ nRow, nCol ] )
ENDSWITCH
RETURN "?"
CASE Qt_EditRole /* Here we can specify different formats for editing*/
SWITCH aStru[ nCol, 2 ]
CASE "C"
RETURN AllTrim( aData[ nRow, nCol ] )
CASE "N"
RETURN hb_ntos( aData[ nRow, nCol ] )
CASE "L"
RETURN iif( aData[ nRow, nCol ], "Y", "N" )
CASE "D"
RETURN DToC( aData[ nRow, nCol ] )
ENDSWITCH
RETURN "?"
CASE Qt_ForegroundRole
SWITCH aStru[ nCol, 2 ]
CASE "N"
RETURN oColorN
CASE "L"
RETURN iif( aData[ nRow, nCol ], oColorLY, oColorLN )
CASE "D"
RETURN oColorD
ENDSWITCH
RETURN NIL
CASE Qt_BackgroundRole
RETURN NIL
CASE Qt_TextAlignmentRole
SWITCH aStru[ nCol, 2 ]
CASE "C"
RETURN Qt_AlignVCenter + Qt_AlignLeft
CASE "N"
RETURN Qt_AlignVCenter + Qt_AlignRight
ENDSWITCH
RETURN Qt_AlignCenter
ENDSWITCH
RETURN NIL
CASE HBQT_QAIM_headerData
SWITCH role
CASE Qt_DisplayRole
IF nX == Qt_Horizontal
RETURN aStru[ nRow, 1 ]
ELSE
RETURN hb_NToS( nRow )
ENDIF
CASE Qt_TextAlignmentRole
IF nX == Qt_Horizontal
RETURN Qt_AlignCenter
ELSE
RETURN Qt_AlignVCenter + Qt_AlignRight
ENDIF
CASE Qt_SizeHintRole
RETURN oSize
ENDSWITCH
RETURN NIL
CASE HBQT_QAIM_rowCount
RETURN Len( aData )
CASE HBQT_QAIM_columnCount
RETURN Len( aStru )
ENDSWITCH
RETURN NIL
STATIC FUNCTION connect( tb1, aStruct, nCX1, nCY1 )
LOCAL oID, oSM
oID := tb1:itemDelegate()
oID:connect( "commitData(QWidget*)", {| w | my_save( w, aStruct, @nCX1, @nCY1 ) } )
oSM := tb1:selectionModel()
oSM:connect( "currentChanged(QModelIndex,QModelIndex)", {| n | my_select( n, @nCX1, @nCY1 ) } )
RETURN NIL
STATIC FUNCTION my_addRow( oHBQAbsModel )
STATIC nPay := 400
nPay += 30
AAdd( aData, { "Kitty", SToD( "20120625" ), nPay, .T. } )
oHBQAbsModel:reset() /* Re-populate the model */
RETURN .T.
/*----------------------------------------------------------------------*/