Qt c ++不会为所有对象调用move_slot。为什么?

时间:2019-12-03 11:06:28

标签: c++ qt

int forIterator = 0;
Scenes::Scenes(QWidget * parent): QObject ()
{
    setScene(scene);

    for(int i = 0; i < Dot::number_of_dotz; i++)
    {
        QTimer *timer_move = new QTimer();
        QObject::connect(timer_move,SIGNAL(timeout()),dotz[i],SLOT(move_slot()));
        timer_move->start(10);
    }

由于创建了一个新的点,因此在move_slot()中更新了Dot :: number_of_dots(+1),但是从未调用过该新点的move_slot。 为什么会这样(不发生)?

1 个答案:

答案 0 :(得分:0)

似乎您应该在Dot中创建一个新的move_slot()。当Dot :: number_of_dotz静态成员的值大于0并且可能已经在其中创建了一些点实例时,将调用Scenes::Scenes(QWidget * parent)构造函数。因此,Scene构造函数被调用一次,并且不会被再次调用。

很明显,您正在执行此操作,因为您想在创建Scenes类之后开始扩展dotz。

我的解决方案是检查sender()中的move_slot()类型,如果它是QTimer,则可以在QTimer本身中创建新的move_slot()

我建议您为QTimer设置一个父级,以防止内存泄漏。

void Dot::move_slots(){

    // your code 

    QTimer *caller_object = qobject_cast<QTimer*>(sender());
    // caller_object will be nullptr if this slot is not being called
    // by an object other than a QTimer
    if(caller_object){   
        QTimer *timer_move = new QTimer(this);
        QObject::connect(timer_move,SIGNAL(timeout()),this,SLOT(move_slot()));
        timer_move->start(10);
    }
}

我希望我对您想要实现的目标的假设是正确的。如果不是这种情况,请发表评论。