Это основная проблема: «Примечание: startTimer () запускается из другого потока с сигналом». Однако вы создаете экземпляр MyTimer в главном потоке, который отличается, поскольку вы пытаетесь запустить таймер в другом потоке. Вы должны либо создать свой таймер в потоке, для которого нужно активировать тайм-аут, либо переместить таймер в этот поток, а затем подключить свой таймер к тайм-ауту и слоту. Например, вы можете сделать это, может быть (не проверено, будет ли это действительно работать):
MyTimer::startTimer(void)
{
timer->moveToThread(QThread::currentThread());
connect(timer, &QTimer::timeout, this, &MyTimer::mySlot);
timer->start(1000);
}
Однако я бы предложил следующий подход, поскольку перемещение объектов между потоками может привести к путанице в вашем коде, усложнить управление, поэтому, на мой взгляд, для решения вашей проблемы предпочтительнее самое простое решение.
MyTimer::startTimer(void)
{
// Create your timer on the thread you want
timer = new QTimer(this);
// Connect signal and slot
connect(timer, &QTimer::timeout, this, &MyTimer::mySlot);
// Start the timer
timer->start(1000);
}
Какой из них использовать, зависит от вас, но вы должны знать, что соединение сигналов и слотов между различными потоками не работает в Qt, и все соединения должны быть созданы в одном потоке, и действия, инициирующие эти соединения, должны также выполняться в том же потоке, где было установлено соединение.