2015-07-01 7 views
5

Effettuo le seguenti operazioni:Perché un programma Qt elabora i dati degli appunti quando si incolla dagli Appunti a un programma esterno?

1) Copia i dati negli Appunti nel mio programma Qt su Windows.

QApplication::clipboard()->setText(data); 

2) Incollare i dati su un programma esterno (notepad.exe). Successivamente il mio programma inizia a elaborare i dati degli appunti. Chiede metodi specifici di Windows:

QWindowsOleDataObject::GetData(...); 
... QWindowsMimeText::convertFromMime(...); 

è un problema, perché quando la dimensione dei dati in clipboard è grande il mio programma non sulla memoria assegnando a questi metodi.

Non riesco a capire perché lo stack di chiamate è abbastanza strano:

qwindowsd.dll!QWindowsMimeText::convertFromMime(const tagFORMATETC & formatetc, const QMimeData * mimeData, tagSTGMEDIUM * pmedium) Line 606 C++ 
qwindowsd.dll!QWindowsOleDataObject::GetData(tagFORMATETC * pformatetc, tagSTGMEDIUM * pmedium) Line 144 C++ 
[External Code] 
Qt5Cored.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 740 C++ 
qwindowsd.dll!QWindowsGuiEventDispatcher::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 73 C++ 
Qt5Cored.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 129 C++ 
Qt5Cored.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 204 C++ 
Qt5Cored.dll!QCoreApplication::exec() Line 1188 C++ 
Qt5Guid.dll!QGuiApplication::exec() Line 1508 C++ 
Qt5Widgetsd.dll!QApplication::exec() Line 2957 C++ 
main(int argc, char * * argv) Line 759 C++ 

E 'un po' di lavoro interno Qt, non so come impatto su di esso.

risposta

1

Qt potrebbe ottimizzare l'utilizzo degli Appunti "interni". Quindi, QApplication::clipboard()->setText(data); non copia realmente gli appunti di Windows data - potresti incollarlo nella stessa applicazione Qt, quindi non è necessario copiare negli appunti di Windows e viceversa. Solo quando si utilizza un'applicazione esterna, si verifica una copia reale.

Qt probabilmente registra il provider di dati OLE come "origine dati degli appunti" e Windows lo utilizza quando i dati degli appunti sono necessari nell'app esterna.

Quindi i big data sono in data dall'inizio.

Fonti: implementazione Qt Appunti per Windows QWindowsClipboard usa: OleSetClipboard, che accetta puntatore alla fonte di dati, non dati stessi

+0

Grazie! Sembra logicamente buono. È la tua ipotesi o funziona come hai descritto? Potresti condividere un link ad alcuni documenti, per favore, se ce l'hai? – Deutsche

+0

@Deutsche era un'ipotesi basata su come funzionava qualche tempo fa, guardando il codice - sembra ancora adeguato (link in risposta modificata) – Hcorg

+0

Grande! Grazie per la risposta, spiega il problema. Se sei così esperto in questo argomento, forse sai come prendere questa situazione (male_alloc in questo codice Qt sull'elaborazione degli eventi) e continuare correttamente il lavoro del software? – Deutsche