Асинхронно обновлять несколько QQuickPaintedItem на QML

Я пытаюсь использовать класс, который наследуется от QQuickPaintedItem, для отображения видеокадров, снятых с помощью openCV.

в этом классе есть слот под названием queryFrame (), который связан с тайм-аутом QTimer (40 мс):

connect(m_timer, SIGNAL(timeout()), this, SLOT(queryFrame()));

код queryFrame ():

void CVCamScreen::queryFrame()
{
if(!m_url.isEmpty()){
if( !m_capture->isOpened() ) {
m_capture->open( m_url.toStdString() );
}

cv::Mat frame;
m_capture->read( frame );

m_qImage = ipl2Qimg(new IplImage(frame));

update();

emit frameChanged();
}
}

Каждый раз, когда вызывается queryFrame (), он должен обновлять представление. Он делает это, но не работает асинхронно.

Как я должен сделать каждое из этих обновлений CVCamScreen самостоятельно самостоятельно?

QML-код, который отображает CamScreens:

Repeater {
model: 8

CVCamScreen {
Layout.fillWidth: true
Layout.fillHeight: true

url: Controller.urlCanal(index + 1)

CustomBorder {
commonBorder: true
color: "#228e14"commonBorderWidth: 3
}

onUrlChanged: {
start(); // starts the timer when the URL changes.
}
}
}

0

Решение

Ваша проблема в том, что все CVCamScreen объекты находятся в одном потоке. Таким образом, события таймера доставляются к ним последовательно. Я бы предложил перенести фактическое чтение с устройства и ipl2Qimg() запихать в фоновый поток, который просто уведомит CVCamScreen когда данные готовы и update() должен быть назван.

1

Другие решения


По вопросам рекламы [email protected]