2015-10-08 7 views
7

Sto utilizzando la funzione QFileDialog::getOpenFileName per aprire un file. Tuttavia, sul computer di un client su cui è in esecuzione Windows 7, viene visualizzata una finestra di dialogo dei file aperti danneggiata, come mostrato nell'immagine, oppure arresta l'intera applicazione.Finestra di dialogo Qt file visualizzata in modo errato e si blocca

Corrupted Dialog

Il codice che uso per aprire la finestra di dialogo del file è:

void MainWindow::on_action_triggered() { 
    auto filename = QFileDialog::getSaveFileName(this, "Generate Report", "", "CSV files (*.csv)"); 

    if (filename.isEmpty()) { 
     return; 
    } 

    // Do operations on filename... 
} 

Sto usando Qt 5.5 con Visual Studio 2013.

+0

Doe succede con 'getOpenFileName',' getSaveFileName' o entrambi? – Mailerdaimon

+1

Prova in build di debug, probabilmente manchi qualche dll nel rilascio. – Jerry

+0

@Mailerdaimon succede per entrambi. – ajshort

risposta

3

Il problema in questo caso particolare è risultato essere un'incompatibilità tra Qt e il software Dell Backup and Recovery installato sul computer client, che includeva un'estensione shell incompatibile. La soluzione che ho usato è stata quella di rimuovere il software di backup e ripristino, ma suona come il namespace. Qt è anche un'alternativa. Ulteriori informazioni sono disponibili in QTBUG-41416.

4

Sto indovinando che c'è un problema con la directory. Questa stringa vuota fornita come percorso potrebbe essere problematica. Prova risolvere il problema in questo modo:

auto filename = QFileDialog::getSaveFileName(this, 
              tr("Generate Report"), 
              QString(), 
              tr("CSV files (*.csv)")); 
// or this way 
auto filename = QFileDialog::getSaveFileName(this, 
              tr("Generate Report"), 
              QDir::home().absolutePath(), 
              tr("CSV files (*.csv)")); 
+0

Cheers! Ho inviato al client un'applicazione con entrambi questi test. Se non è questo, immagino che probabilmente è un'estensione della shell dubbia come alcuni dei commenti suggeriti. – ajshort

+0

Purtroppo sfortunatamente, ho provato le varianti senza argomento, un costrutto QString predefinito e una directory esistente per lo stesso risultato. Grazie comunque! – ajshort

+0

puoi fornire uno stack per le chiamate d'emergenza? È più facile se costruisci Qt da solo. –

2

La radice del problema sembra essere corruzione della memoria. Per trovarlo, installa Microsoft Application Verifier e configura la tua app con Basics\Heaps. Puoi farlo sul tuo computer, anche se il problema originale non si è riprodotto. Dopo di ciò, prova a riprodurre il problema e credo che troverai la corruzione della memoria.

Aggiornamento
Ora che il problema non riprodurre sulla vostra macchina e tu dici la finestra di dialogo è appeso, suggerisco i seguenti passaggi aggiuntivi (si può fare tutto da soli in una sessione di TeamViewer per rendere più facile)

  1. Abilita Application Verifier sul computer del cliente per il tuo EXE. Come effetto collaterale, ciò abilita la traccia dell'heap.
  2. Catturare una (serie) di discariche durante l'impiccagione. Avere almeno una discarica completa tra le serie. Ad esempio, puoi farlo con SysInternals Process Explorer. Analizzandoli in seguito, sarai in grado di vedere cosa sta facendo l'applicazione. Non dimenticare di generare e salvare i file PDB (informazioni di debug) per il tuo EXE (anche se penso che l'hang sarebbe fuori dal tuo exe).
+0

Ha dato un colpo, sfortunatamente sfortunatamente. – ajshort

+0

Ti suggerisco di chiedere al tuo cliente azioni precise che sta eseguendo. Per il danneggiamento della memoria, un buffer overflow è piuttosto tipico. Cioè, qualcosa può essere più grande di quanto ti aspettassi. – Codeguard

+0

Ho inviato al cliente un programma minimale che ha aperto solo una finestra di dialogo dei file (nient'altro) e ha comunque mostrato il problema. – ajshort

-1

Provare a 32 bit anziché 64 bit.

+0

Il mio primo post è stato rimosso da "Jon Clements", quindi questa volta solo una pura risposta senza le mie scoperte e pensieri –

+1

Questo non fornisce una risposta Alla domanda: per criticare o chiedere chiarimenti ad un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai sufficiente [reputazione] (http://stackoverflow.com/help/whats- reputazione) sarete in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). – mkaes

+0

Nessuna risposta qui risponda alla domanda. una pura ipotesi (che non aiuta a proposito) e la seconda è solo un'idea, non la soluzione. Il problema è che c'è sicuramente il danneggiamento della memoria, ma non è nel codice di ajshort o in Qt, ma in qualche libreria che viene caricata dalla finestra di dialogo di apertura del file, che è installata sul computer dell'utente. Ciò rende difficile il debug. Ho affrontato questo problema circa 5 volte e in tutti i casi la versione a 32 bit del programma ha funzionato, mentre 64 bit si sono bloccati. Beh ... l'ho scritto nella mia risposta CANCELLATA. Grazie. –

Problemi correlati