Signal and slot related issue?
-
Your connect statement is missing a closing ).
To answer your question: yes, b2 will have access to a pointer to b1 at the time the slot is invoked via QObject::sender(). However, I recommend you try to avoid it. Usually, QSignalMapper will do the trick. Note that you can not distinguish between different signals of the same object connected to a slot. You can only know what object fired an event that triggered your slot, but not what signal was fired to trigger it.
-
animate_button() is supposed to be a slot, i.e. a member-function of a class. b2 is supposed to be [a pointer to] an object of that class. So, the pointer you're looking is... ‘this'.
If you meant b1 rather than b2, call QObject::sender() to know who sent the signal.
-
Of course there is some delay. The click creates an event, that is put into the event loop, the event loop is processed, the signal is emitted, all the connected slots are called, the slot is executed, slot stop of the timer is called...
If your machine is busy, this all can last longer than a few microseconds...
-
@
Button::Button (QWidget *parent,
QPixmap &pixmap1,
QString tool_tip_text,
char *btn_txt,
bool erase_bkground,
QRect rect,
int num_states
) : QPushButton( parent),
m_hovered(false),
m_pressed(false),
is_animate(false)
{
pixmap = pixmap1;
button_width = rect.width ();
button_height = rect.height();
num_of_states = num_states;
num_of_images = pixmap.width()/button_width;
press_count = 0;
count = 0;
link_flag = false;
button_txt = btn_txt;
tt_flag = true;
tt_normal = tool_tip_text;
timer = new QTimer(this);target = QRectF(0.0, 0.0, button_width, button_height); source = QRectF(0.0, 0.0, button_width, button_height);
}
Button::~Button ()
{}void Button::draw_button_normal()
{
this->m_pressed = false; m_hovered = false; //source = QRectF(0.0, 0.0, button_width, button_height); qDebug ()<<"normal"; if (this->is_animate) { timer->singleShot (5000, this, SLOT(mousePress ())); } else { timer->stop(); qDebug()<<"stop timer"; // source = QRectF(0.0, 0.0, button_width, button_height); } qDebug()<<"mouse press"<<this->m_pressed<<m_hovered; qDebug()<<this; this->repaint(); qDebug()<<this;
}
void Button::animate_button (bool is_animate)
{
this->is_animate = is_animate;
if (this->is_animate) {
timer->start ();
mousePress ();
qDebug ()<<"timer called";
} else {
is_animate = false;draw_button_normal(); } qDebug()<<this<< "animate button";
// draw_button_normal ();
}void Button::mousePress ()
{
this->m_pressed = true;
m_hovered = false;if(num_of_states == 2) { press_count++; } if (this->isEnabled ()) { source = QRectF((button_width) * 2.0, 0.0, button_width, button_height); } if(num_of_images == 4) { count++; source = QRectF(0.0, 0.0, button_width, button_height); } if (this->is_animate) { timer->singleShot (5000, this,SLOT(draw_button_normal())); qDebug ()<<"mousePress"; } this->repaint();
}
void Button::paintEvent (QPaintEvent *e)
{
qDebug()<<"mpressed1"<<this->m_pressed<<m_hovered;
Q_UNUSED(e);QPainter painter(this); painter.setRenderHint(QPainter::HighQualityAntialiasing); if (!pixmap.isNull ()) { this->resize(pixmap.width(), pixmap.height()); QRegion region(0,0,0,0); QImage image = pixmap.toImage(); QRgb rgb;
......................
.................................if (this->isEnabled()) { if(num_of_images == 4) { painter.drawPixmap(target, pixmap, source); painter.drawText (target, Qt::AlignCenter , tr(button_txt)); } else { qDebug()<<this; if(!this->m_pressed) { qDebug()<<"not this->m_pressed paint event"; source = QRectF(0.0, 0.0, button_width, button_height); } painter.drawPixmap(target, pixmap, source); painter.drawText (target, Qt::AlignCenter , button_txt); qDebug()<<m_hovered; if (m_hovered) { qDebug()<<"m_hovered paint event"; source = QRectF(0.0, 0.0, button_width, button_height); painter.drawPixmap(target, pixmap, source); source = QRectF(button_width, 0.0, button_width, button_height); painter.drawPixmap(target, pixmap, source); //source = QRectF(0.0, 0.0, button_width, button_height); //painter.drawPixmap(target, pixmap, source); painter.drawText (target, Qt::AlignCenter , tr(button_txt)); } } painter.drawPixmap(target, pixmap, source); painter.drawText (target, Qt::AlignCenter , tr(button_txt)); } break; case 2:
@
here actually i am getting a unexpected output
when i am stopping a timer of button2 from button1 by
QObject::connect(button1, SIGNAL(clicked()),button2,SLOT(animate_button()));
when the timer stop the value of m_pressed and m_hovered in draw_button_normal() button is false and false but after this when repaint is called the value of m_pressed and m_hovered is changing to false and true.
I am not able to detect why this value changed in paint event even if i am not changing.