Get Progress Using COPYFILEEXW in Qt

Source: Internet
Author: User

#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 (),                              &copyprogress, 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;&AMP;&NBSP;SRC, &NBSP;CONST&NBSP;QSTRING&NBSP;&AMP;&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

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.