MacOS X - Liste von Dateien per Drag and Drop

Alles rund um die Programmierung mit Qt
Antworten
PANGAEA
Beiträge: 23
Registriert: 16. Januar 2005 18:10
Wohnort: Bremerhaven
Kontaktdaten:

MacOS X - Liste von Dateien per Drag and Drop

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
PANGAEA
Beiträge: 23
Registriert: 16. Januar 2005 18:10
Wohnort: Bremerhaven
Kontaktdaten:

Dateilisten - Drag and Drop - MacOS X

Beitrag 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;
}
}
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
Antworten