#include <QApplication> #include <QFileDialog> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QGridLayout> #include < qthread> #include <QPointer> #include <QStateMachine> #include <windows.h> Static qstring getlasterrormsg () { LPWSTR bufPtr = NULL; dword err = getlasterror (); formatmessagew ( format_message_allocate_buffer | FORMAT_MESSAGE_FROM_SYSTEM | format_message_ignore_ inserts, null, err, 0, (LPWSTR) &bufptr, 0, null); const qstring result = (BufPtr) ? qstring::fromutf16 ((const ushort*) bufptr). Trimmed () : qstring ("unknown error %1"). Arg (err); localfree ( BUFPTR); return result;} Class copierworker : public qthread { // only to be used by the copier object bool m_stop; qstring m_ Src, m_dst; qpointer<qobject> m_object; static dword callback copyprogress ( LARGE_INTEGER Totalsize, large_integer totaltransferred, large_integer streamsize, large_integer streamtransferred, &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;DWORD&NBSP;STREAMNO,&NBSP;DWORD&NBSP;CALLBACKREASON,&NBSP;HANDLE&NBSP;SRC, handle dst, lpvoid data) { q_unused (streamsize) q_unused (streamTransferred) q_unused (Streamno) q_unused (Callbackreason) q_ UNUSED (SRC) q_unused (DST) QObject * object = static_cast<qobject*> (data); const qstring text = qstring ("Transferred %1 of %2 bytes") . arg (Totaltransferred.quadpart). Arg (Totalsize.quadpart); qmetaobject::invokemethOD (object, "NewStatus", qt::queuedconnection, q_arg (qstring, text)); return Progress_continue; } void run () { &NBSP;M_STOP&NBSP;=&NBSP;FALSE;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;BOOL&NBSP;RC&NBSP;=&NBSP;COPYFILEEXW (( LPCWSTR) M_src.utf16 (), (LPCWSTR) m_dst.utf16 (), ©progress, m_object, &m_stop, 0); if (!RC) { qmetaobject::invokemethod (m_object, " NewStatus ", qt::queuedconnection, q_ ARG (Qstring, getlasterrormsg ())); } } copierworker (const qstring & src, const qstring & dst, qobject * obj) : m_src (SRC), m_dst (DST), m_object ( obj) {} void stop () { m_stop = TRUE; } friend class copier;}; Class copier : public qobject { q_object qpointer <copierworker> m_worker;public: copier (CONST&NBSP;QSTRING&NBSP;&&NBSP;SRC, &NBSP;CONST&NBSP;QSTRING&NBSP;&&NBSP;DST) : m_worker (New copierworker (SRC,&NBSP;DST,&NBSp;this) { connect (M_worker, signal (finished ()), SIGNAL ( Finished ()); connect (M_worker, signal (finished ()), m_worker, slot (Deletelater ())); } ~copier () { if (!m_worker) return; m_worker->stop (); if (!m_worker->isrunning ()) delete m_worker; } q_signal void newstatus (const qstring &); Q_SIGNAL void finished (); q_slot void stop () { m_worker->stop (); } void copy () { m_worker->start (); }};class widget : public QWidget { Q_OBJECT QLabel * m_status; qlineedit * M_src, * m_dst; q_signal void stopcopy (); Q_SLOT Void startcopy () { copier * copier = new copier (M_src->text (), m_dst->text ()); connect (Copier, signal (NewStatus (QString)), m_status, slot (SetText (QString))); connect (Copier, signal (finished ()), signal (copyfinished ())); connect (This, signal (Stopcopy ()), copier, slot (Stop ())); copier->copy (); } q_signal void copyfinished ();p ublic: widget (qwidget * parent = 0) : qwidget (parent) { qgridlayout * layout = new qgridlayout (This); m_src = new qlineedit; m_dst = new qlineedit; qpushbutton * srcbutton = new qpushbutton ("..."); qpushbutton * dstbutton = new qpushbutton ("..."); qpushbutton * copy = new qpushbutton ("copy"); qpushbutton * cancel = new qpushbutton ("Cancel"); qfiledialog * getsrc = new qfiledialog (this, " Source file "); qfiledialog * getdst = new Qfiledialog (this, "Source file"); m_status = new Qlabel; layout->addwidget (New qlabel ("From:"), 0, 0, 1, 1, qt::alignright); layout->addwidget (m_src, 0, 1, 1, 1); layout->addwidget (srcbutton, 0, 2, 1, 1); layout->addwidget (New qlabel ("To:"), &NBSP;1,&NBSP;0,&NBSP;1,&NBSP;1,&NBSP;QT:: AlignRight); layout->addwidget (m_dst, 1, 1, 1, 1); layout->addwidget (dstbutton, 1, 2, 1, 1); layout->addwidget (m_status, 2, 0, 1, 3); layout->addwidget (Copy, 3, 0, 1, 3, qt::aligncenter); layout->addwidget (CANCEL,&NBSP;4,&NBSP;0,&NBSP;1,&NBSP;3,&NBSP;QT:: AlignCenter); getsrc->setfilemode (Qfiledialog::existingfile); getdst-> Setacceptmode (Qfiledialog::acceptsave); connect (SrcButton, SIGNAL ( Clicked ()), getsrc, slot (Show ())); connect (dstbutton, signal (Clicked ()), getdst, slot (Show ())); connect (Getsrc, signal ( Fileselected (QString)), m_src, slot (SetText (QString))); connect ( Getdst, signal (fileselected (QString)), m_dst, slot (SetText (QString))); qstatemachine * machine = new qstatemachine (This); qstate * stopped = new qstate (Machine); qstate * copying = new qstate (Machine); machine->setinitialstate (Stopped); stopped->addtransition (Copy, signal (clicked ()), copying); stopped->assignproperty (copy, "enabled", true); stopped->assignproperty (cancel, "enabled", false); copying->addtransition (Cancel, signal (clicked ()), stopped); copying->addtransition (This, signal (copyfinished ()), stopped); connect (Copying, signal (entered ()), slot (StartCopy ())); connect (Copying, signal (exited ()), signal (Stopcopy ())); copying->assignproperty (copy, "enabled", false); copying->assignproperty (cancel, "enabled", true); Machine->start (); }};int main (int argc, char *argv[]) { qapplication a (argc, argv); widget w; w.show (); return a.exec ();} #include "Main.moc"
Get Progress Using COPYFILEEXW in Qt