Seite 1 von 1

MacOS X - Liste von Dateien per Drag and Drop

Verfasst: 16. Januar 2005 18:22
von PANGAEA
Hallo Experten,

ich benötige eine kleine Routine, die mir alle Dateinamen auflistet, die ich per Drag and Drop auf ein göffnetes Programmfenster geworfen habe. Ich habe bereits eine Lösung, die unter Windows hervorragend funktioniert. Der gleiche Code unter MacOS erkennt zwar auch die Dateinamen, das Programm bleibt an aber einige Sekunden später hängen. Wird die Dateiliste per Datei-Dialog erzeugt, gibt es keine Probleme.

Gruß
Rainer

Verfasst: 16. Januar 2005 21:14
von FlorianBecker
Hallo,

poste einmal bitte deinen Code, ich habe zwar keine Erfahrung mit MAC, aber vielleicht einer der anderen Leute hier. Evtl. ist es auch nur ein Problem, das man von hingucken bereits lösen kann.

Dateilisten - Drag and Drop - MacOS X

Verfasst: 17. Januar 2005 08:42
von PANGAEA
Hallo Zusammen,

wie schon geschrieben, unter Windows und Linux läuft diese Klasse klasse. Unter MacOS werden die Dateien auch erkannt, das Programm bleibt dann aber einige Sekunden später hängen.

Gruß
Rainer

Hier der Code:

DDListBox::DDListBox( QWidget * parent, const char * name, WFlags f ) : QListBox( parent, name, f )
{
setAcceptDrops( TRUE );
dragging = FALSE;
}

void DDListBox::dropEvent( QDropEvent *evt )
{
unsigned int i = 0;

QStringList sl_fileNames;

QFileInfo fi;

if ( QUriDrag::canDecode( evt ) )
{
clear();

gsl_Path = sl_fileNames;
gsl_Name = sl_fileNames;

QUriDrag::decodeLocalFiles( evt, sl_fileNames );

sl_fileNames.sort();

for ( i=0; i<sl_fileNames.count(); i++ )
{
fi.setFile( sl_fileNames[i] );

if ( fi.isFile() == TRUE )
{
gsl_Path.append( fi.dirPath() );
gsl_Name.append( fi.fileName() );

insertItem( sl_fileNames[i] );
}

if ( fi.isDir() == TRUE )
{
QDir d( sl_fileNames[i] );
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list );
QFileInfo *fd;

it += 2; // skips "." and ".."

while ( ( fd = it.current() ) != 0 )
{
fi.setFile( fd->dirPath()+"/"+fd->fileName() );
if ( fi.isFile() )
{
gsl_Path.append( fd->dirPath()+"/" );
gsl_Name.append( fd->fileName() );
insertItem( fd->dirPath()+"/"+fd->fileName() );
}
++it;
}
}
}

// insertItem( "Choose a tool." );
emit finished( FALSE );
}
}

void DDListBox::dragEnterEvent( QDragEnterEvent *evt )
{
bool b_OK = FALSE;

if ( QUriDrag::canDecode( evt ) )
{
b_OK = TRUE;
}
else
{
clear();
insertItem( "Drag some files or a folder onto this application." );
}

evt->accept( b_OK );
}


void DDListBox::mousePressEvent( QMouseEvent *evt )
{
QListBox::mousePressEvent( evt );
dragging = TRUE;
}


void DDListBox::mouseMoveEvent( QMouseEvent * )
{
if ( dragging )
{
QDragObject *d = new QTextDrag( currentText(), this );
d->dragCopy(); // do NOT delete d.
dragging = FALSE;
}
}

Verfasst: 24. Januar 2005 21:18
von ArneStocker
Hi Rainer

also versuch doch mal Deinen Code mit <code> </code> (nur in eckigen Klammern) darzustellen, das kann man ja fast nicht mehr lesen.

Mir ist aufgefallen, dass Du Deine Drag - Aktion innerhalb eines MouseMoveEvent startest. Bist Du sicher, dass bis zum Beenden der Aktion keine weitere Mouse - Move events eintreffen können und dass das für alle Plattformen gilt ? Ansonsten werden (mehrere) QDragObjekte erzeugt . Du kannst ja mal testweise ein zweites Flag (z.B. isInDragMode) einbauen etwa in der Weise

Code: Alles auswählen

void blabla::mousesMoveEvent(..)
{
	if (	(dragging == true) 	&& 
			(isInDragMode == false)	)
	{
		isInDragMode)= true;
		... 
		isInDragMode)= false;
	}
}
Ich persönlich starte meine Drag - Aktionen in einer Methode, die ich mit dem Slot pressedEvent des Views verbinde.

Gruss Arne