c++ - Widgets must be created in the GUI thread Error !. How to correct the code? -


i have experience c++ i'm qt beginner few days. @ simple application code below, "main.cpp" code file in project. problem when try run application returns me error widgets must created in gui thread. how go around ?. possible write application works want without additional thread ?. if yes how ?. please help. can't working myself.

#include <qapplication> #include <qwidget> #include <qboxlayout> #include <qgridlayout> #include <qpushbutton> #include <qspinbox> #include <qslider> #include <qradiobutton> #include <qframe> #include <qlcdnumber> #include <qprogressbar> #include "windows.h"  dword winapi trd1entry(lpvoid lpparam) ;  int main(int argc, char **argv) {     qapplication app(argc, argv) ;     qwidget *window = new qwidget() ;     window->resize(500, 400) ;      qhboxlayout *layout0 = new qhboxlayout() ;     qgridlayout *layout1 = new qgridlayout() ;     qvboxlayout *layout2 = new qvboxlayout() ;     qvboxlayout *layout3 = new qvboxlayout() ;      qslider slider0(qt::horizontal), slider1(qt::horizontal) ;     qlcdnumber lcd0, lcd1 ;     qradiobutton rb0, rb1, rb2 ;     qpushbutton pb0("reset"), pb1("quit") ;     qprogressbar progress0 ;     qspinbox spin0, spin1 ;      spin0.setrange(-100, 100) ;     spin1.setrange(-100, 100) ;     slider0.setrange(-100, 100) ;     slider1.setrange(-100, 100) ;      rb0.settext("reset first") ;     rb1.settext("reset second") ;     rb2.settext("reset both") ;      layout1->addwidget(&slider0, 0, 0) ;     layout1->addwidget(&spin0, 0, 1) ;     layout1->addwidget(&spin1, 1, 0) ;     layout1->addwidget(&slider1, 1, 1) ;     layout1->addwidget(&lcd0, 2, 0) ;     layout1->addwidget(&lcd1, 2, 1) ;      layout2->addwidget(&rb0) ;     layout2->addwidget(&rb1) ;     layout2->addwidget(&rb2) ;     layout2->addwidget(&pb0) ;     layout2->addwidget(&pb1) ;      layout0->addlayout(layout1) ;     layout0->addlayout(layout2) ;      qframe *frame = new qframe() ;     frame->setlayout(layout0) ;      layout3->addwidget(frame) ;     layout3->addwidget(&progress0) ;      frame->setframeshape(qframe::box) ;     frame->setframeshadow(qframe::raised) ;     frame->setlinewidth(1) ;     frame->move(10, 10) ;      progress0.setrange(-200, 200) ;      qobject::connect(&spin0, signal(valuechanged(int)), &slider0, slot(setvalue(int))) ;     qobject::connect(&spin1, signal(valuechanged(int)), &slider1, slot(setvalue(int))) ;     qobject::connect(&slider0, signal(valuechanged(int)), &spin0, slot(setvalue(int))) ;     qobject::connect(&slider1, signal(valuechanged(int)), &spin1, slot(setvalue(int))) ;     qobject::connect(&spin0, signal(valuechanged(int)), &lcd0, slot(display(int))) ;     qobject::connect(&spin1, signal(valuechanged(int)), &lcd1, slot(display(int))) ;      qobject::connect(&pb1, signal(clicked()), &app, slot(quit())) ;      qobject *objs[3] = {&spin0, &spin1, &progress0} ;      handle trd1handle = createthread(null, 0, trd1entry, objs, 0, null) ;     if(trd1handle == null)     exitprocess(0) ;      window->setlayout(layout3) ;      window->show() ;     return app.exec() ; }  dword winapi trd1entry(lpvoid lpparam) {     qobject **objs = static_cast<qobject**>(lpparam) ;     qspinbox *spin0 = static_cast<qspinbox*>(objs[0]) ;     qspinbox *spin1 = static_cast<qspinbox*>(objs[1]) ;     qprogressbar *progress = static_cast<qprogressbar*>(objs[2]) ;     handle trd1handle = getstdhandle(std_output_handle) ;     if(trd1handle == invalid_handle_value)     return -1 ;     int total = 0 ;     while(1)     {         total = spin0->value() + spin1->value() ;         progress->setvalue(total) ;         sleep(100) ;     }     return 0 ; } 

below code explain , resolve problem. if usefull or method resolved problem please vote

main.cpp:

#include <qapplication> #include <qwidget> #include <qboxlayout> #include <qgridlayout> #include <qpushbutton> #include <qspinbox> #include <qslider> #include <qradiobutton> #include <qframe> #include <qlcdnumber> #include <qprogressbar> #include "qspinstransmit.h"  int main(int argc, char **argv) {     qapplication app(argc, argv) ;     qwidget *window = new qwidget() ;     window->resize(500, 400) ;      qhboxlayout *layout0 = new qhboxlayout() ;     qgridlayout *layout1 = new qgridlayout() ;     qvboxlayout *layout2 = new qvboxlayout() ;     qvboxlayout *layout3 = new qvboxlayout() ;      qslider slider0(qt::horizontal), slider1(qt::horizontal) ;     qlcdnumber lcd0, lcd1 ;     qradiobutton rb0, rb1, rb2 ;     qpushbutton pb0("reset"), pb1("quit") ;     qprogressbar progress0 ;     qspinbox spin0, spin1 ;     qspinstransmit *transmit = new qspinstransmit(&spin0, &spin1) ;      spin0.setrange(-100, 100) ;     spin1.setrange(-100, 100) ;     slider0.setrange(-100, 100) ;     slider1.setrange(-100, 100) ;      rb0.settext("reset first") ;     rb1.settext("reset second") ;     rb2.settext("reset both") ;      layout1->addwidget(&slider0, 0, 0) ;     layout1->addwidget(&spin0, 0, 1) ;     layout1->addwidget(&spin1, 1, 0) ;     layout1->addwidget(&slider1, 1, 1) ;     layout1->addwidget(&lcd0, 2, 0) ;     layout1->addwidget(&lcd1, 2, 1) ;      layout2->addwidget(&rb0) ;     layout2->addwidget(&rb1) ;     layout2->addwidget(&rb2) ;     layout2->addwidget(&pb0) ;     layout2->addwidget(&pb1) ;      layout0->addlayout(layout1) ;     layout0->addlayout(layout2) ;      qframe *frame = new qframe() ;     frame->setlayout(layout0) ;      layout3->addwidget(frame) ;     layout3->addwidget(&progress0) ;      frame->setframeshape(qframe::box) ;     frame->setframeshadow(qframe::raised) ;     frame->setlinewidth(1) ;     frame->move(10, 10) ;      progress0.setrange(-200, 200) ;      qobject::connect(&spin0, signal(valuechanged(int)), &slider0, slot(setvalue(int))) ;     qobject::connect(&spin1, signal(valuechanged(int)), &slider1, slot(setvalue(int))) ;     qobject::connect(&slider0, signal(valuechanged(int)), &spin0, slot(setvalue(int))) ;     qobject::connect(&slider1, signal(valuechanged(int)), &spin1, slot(setvalue(int))) ;     qobject::connect(&spin0, signal(valuechanged(int)), &lcd0, slot(display(int))) ;     qobject::connect(&spin1, signal(valuechanged(int)), &lcd1, slot(display(int))) ;      qobject::connect(&pb1, signal(clicked()), &app, slot(quit())) ;      qobject::connect(transmit, signal(valuechanged(int)), &progress0, slot(setvalue(int))) ;      window->setlayout(layout3) ;      window->show() ;     return app.exec() ; } 

qspinstransmit.h:

#ifndef qspinstransmit_h #define qspinstransmit_h  #include <qspinbox>  class qspinstransmit: public qobject {      q_object      private:     qspinbox *spin0, *spin1 ;      public:     qspinstransmit(qspinbox *spin0 = null, qspinbox *spin1 = null) ;      signals:     void valuechanged(int) ;      public slots:     void valuessum() ; } ;  #endif // qspinstransmit_h 

qspinstransmit.cpp:

#include "qspinstransmit.h"  qspinstransmit::qspinstransmit(qspinbox *spin0, qspinbox *spin1) {     this->spin0 = spin0 ;     this->spin1 = spin1 ;     connect(spin0, signal(valuechanged(int)), slot(valuessum())) ;     connect(spin1, signal(valuechanged(int)), slot(valuessum())) ; }  void qspinstransmit::valuessum() {     emit valuechanged(spin0->value() + spin1->value()) ; } 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -