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:
subclass
qpushbutton
, reimplement mouse click event make emitclicked(int)
, orconnect signal
clicked()
slotonclicked()
. insideonclicked()
, emit signaltofinaldestination(int)
slotfinaldestination(int)
, oruse
qsignalmapper
:
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
Post a Comment