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
Post a Comment