c++ - Why are my slots not called during runtime? -


i'm pretty new qt , try add button (which emits signal on click) during runtime. added slot adding didn't work. testing-purposes i've put printf("hello world"); in code see when method called.

strangely "hello world" when close program... testing purposes i've called add-method in main. if click on button nothing happens. remove main don't more...

maybe can tell me did wrong?

buttoncreator.h

qt_begin_namespace class qaction; class qgroupbox; class qpushbutton; class qvboxlayout; class qgridlayout;  qt_end_namespace  class buttoncreator : public qwidget {     q_object  public:     buttoncreator();  private:     void creategridgroupbox();     unsigned int buttoncount; //number of current buttons       qvboxlayout *mainlayout; //main window     qgroupbox *gridgroupbox; //window buttons     qgridlayout *layout; //button-layout      qpushbutton* getaddbutton(); public slots:     int addbutton(qicon *icon = 0); //add button }; 

buttoncreator.cpp

#include <qtgui> #include "buttoncreator.h"   buttoncreator::buttoncreator() {     creategridgroupbox(); //create window      mainlayout = new qvboxlayout;     mainlayout->addwidget(gridgroupbox);     mainlayout->addwidget(getaddbutton());     setlayout(mainlayout);  }  void buttoncreator::creategridgroupbox() {     gridgroupbox = new qgroupbox();     layout = new qgridlayout;         gridgroupbox->setlayout(layout); }  int buttoncreator::addbutton(qicon *icon) {     printf("hello world");     qpushbutton *button = new qpushbutton();      if (icon != 0) {     button->seticon(*icon); }     layout->addwidget(button, 0, buttoncount);         buttoncount++;      button->show();            //adding didn't change     gridgroupbox->update();    //adding didn't change     layout->update();          //adding didn't change       return buttoncount; }   qpushbutton* buttoncreator::getaddbutton() {     qpushbutton *addbutton = new qpushbutton();      qpixmap pixmap(100, 100);     pixmap.fill(qcolor("blue"));     qicon icon = qicon(pixmap);      connect(addbutton, signal(clicked()), this, slot(addbutton(&icon)));     return addbutton; } 

related signal want add bit confused. it's easy find how slots defined related signals i'm unsure if understood difference.

for example if press button sends absolute number of buttons signal. correct like:

buttoncreator.h

class buttoncreator : public qwidget { .. signals: void getabsbuttons(int anypara);  .. } 

and add with:

connect(newbutton, signal(clicked()), this, slot(getabsbuttons(para))); 

at http://www.qtcentre.org/threads/19493-creating-custom-signal have similar discussion. puzzles me treading signal slot...

because slotaddbutton(&icon) never excuted @ runtime.

while slot can taken regular c++ function, return value of can retrieved when called function. in addition, there no magic in signal & slot mechanism, moc replace connections c++ codes according function signature. it's better keep in mind argument number of slot shouldn less of signal.

for example, these connections work:

connect(sender, signal(destroyed(qobject*)), this, slot(objectdestroyed(qbject*))); connect(sender, signal(destroyed(qobject*)), this, slot(objectdestroyed())); connect(sender, signal(destroyed()), this, slot(objectdestroyed())); 

but 1 won't:

connect(sender, signal(destroyed()), this, slot(objectdestroyed(qobject*))); 

because slot slot(objectdestroyed(qobject*) expecting qobject signal not send. if use qt creator, runtime error of connection reported.


as second question, if you'd send clicking signal accompanied arguments, there @ least 3 ways achieve want, , mentioned in op connect(newbutton, signal(clicked()), this, slot(getabsbuttons(para))); won't work because: first, it's failed connection. second, clicked() signal doesn't send information, serve trigger. if want signal clicked(int) sent qpushbutton click it, may:

  1. subclass qpushbutton , reimplement mouse click event make emit clicked(int), or

  2. connect signal clicked() slot onclicked(). inside onclicked(), emit signal tofinaldestination(int) slot finaldestination(int), or

  3. use qsignalmapper: enter image description here

for more information qsignalmapper, check this link , the document.


[edit]:

a slot function can called regular c++ function (compilation time) or slot (runtime). function connect() make slot fucntion accessible through signal @ run time, hence need pass type of arguments connect(), , varaibles sent decided @ runtime (signal emitted). original post, think mistreated slots normal function in connect(), might blind spot.


Comments

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -