Мой app состоит из симулянта производителя музыки. Давно я написал код, чтобы осуществлять в мой app Qt часы (которые функционировали хорошо), которые появлялись бы в QPlainTextEdit. Я хочу использовать эти часы для того, чтобы он уменьшил время, которое остается для того, чтобы песня закончилась, когда будет нажата кнопка Play. Сейчас, дав play, он уменьшает мне 1,2 или 3 секунды и далее программа ломается, и консоль printea следующее:
QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x20d212c0), parent's thread is QThread(0x1e6f90), current thread is myThreadPlay(0x287f00a0)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
11:24:01: The program has unexpectedly finished.
Восток - .cpp параллельного трэда:
#include "mythreadplay.h"
#include "vprincipal.h"
#include <QDebug>
int Segundos;
int Minutos;
QString Reloj;
myThreadPlay::myThreadPlay(int seg, int min)
{
Segundos=seg;
Minutos=min;
}
myThreadPlay::myThreadPlay(QObject *parent): QThread(parent)
{
}
void myThreadPlay::run()
{
while (Segundos != 0 || Minutos != 0)
{
if(Segundos == 0 && Minutos > 0)
{
Segundos = 59;
Minutos --;
Reloj ="00:"+ QString::number(Minutos) + ":" + QString::number(Segundos);
}
else
{
Segundos--;
Reloj ="00:"+ QString::number(Minutos) + ":" + QString::number(Segundos);
}
emit cambioReloj(Reloj, Minutos, Segundos);
msleep(1000);
}
}
и этот Ваш.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class myThreadPlay : public QThread
{
Q_OBJECT
private:
int Minutos;
int Segundos;
public:
explicit myThreadPlay(QObject *parent = nullptr);
myThreadPlay(int Segundo, int Minuto);
signals:
void cambioReloj(QString, int, int);
protected:
void run();
};
#endif // MYTHREAD_H
Я благодарен за помощь,
Приветствие!
cГіdigo, где я соединяю мою программу с трэдом, это следующий:
void vPrincipal::eventBtnPlay()
{
QString sS = ListaSegs.takeAt(idActual);
int s = sS.toInt();
QString sM = ListaMins.takeAt(idActual);
int m = sM.toInt();
mTPlay = new myThreadPlay(s, m);
mTPlay->start(QThread::HighPriority);
connect(mTPlay, &myThreadPlay::cambioReloj,[&](QString qs, int a, int b)
{
if (a!=0 || b!=0)
{
ui->txtReloj->setPlainText(qs);
}
else idActual++;
}
);
}