Форум программистов, компьютерный форум, киберфорум
QML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 21

QML/C++ и многопоточность

03.01.2016, 18:06. Показов 2990. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Помогите разобраться и решить следующую пролему.

Мне надо соединить сишную часть и qml. Если мы находимся в одном потоке, то задача элементарная и примеров в документации предостаточно. Но что делать в случае многопоточности я не разобрался. В общем есть следующий код:

session.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef SESSION_H
#define SESSION_H
 
#include <QObject>
#include <QThread>
#include <QDebug>
 
#include "randomnum.h"
 
class Session : public QObject
{
    Q_OBJECT
public:
    explicit Session(QObject *parent = 0);
    Q_INVOKABLE void addThreads();
    RandomNum * getRanNumObj();
 
signals:
    void stopAll();
 
public slots:
    void stopThreads();
 
private:
    RandomNum * ranNumObj;
};
 
#endif // SESSION_H
session.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "session.h"
 
Session::Session(QObject *parent) : QObject(parent)
{
    ranNumObj = 0;
}
 
void Session::addThreads()
{
    qDebug() << "Main id" << QThread::currentThreadId();
    QThread *ranNumThread = new QThread;
    getRanNumObj()->moveToThread(ranNumThread);
 
    connect(getRanNumObj(), SIGNAL(finished()),
            getRanNumObj(), SLOT(deleteLater()));
 
    connect(ranNumThread, SIGNAL(finished()),
            ranNumThread, SLOT(deleteLater()));
 
    connect(ranNumThread, SIGNAL(started()),
            getRanNumObj(), SLOT(process()));
 
    ranNumThread->start();
}
 
void Session::stopThreads()
{
    emit stopAll();
}
 
RandomNum *Session::getRanNumObj()
{    
    qDebug() << QThread::currentThreadId();
    if(!ranNumObj) {
        ranNumObj = new RandomNum;
    }
 
    return ranNumObj;
}
randomnum.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef RANDOMNUM_H
#define RANDOMNUM_H
 
#include <QObject>
#include <QThread>
#include <QDebug>
 
class RandomNum : public QObject
{
    Q_OBJECT
public:
    explicit RandomNum(QObject *parent = 0);
 
signals:
    void finished();
    void writeLog(QString log);
 
public slots:
    void process();
    void getNumber();
};
 
#endif // RANDOMNUM_H
randomnum.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "randomnum.h"
 
RandomNum::RandomNum(QObject *parent) : QObject(parent)
{
}
 
void RandomNum::process()
{
    qDebug() << "Process id " << QThread::currentThreadId();
}
 
void RandomNum::getNumber()
{
    //return float(rand()) / float(RAND_MAX);
    emit writeLog(QString::number(float(rand()) / float(RAND_MAX)));
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include <QQmlContext>
 
#include "session.h"
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    Session session;
 
    QQmlApplicationEngine engine;
 
    QQmlContext* ctx = engine.rootContext();
    ctx->setContextProperty("Session", &session);
    ctx->setContextProperty("RandNum", session.getRanNumObj());
 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
 
    return app.exec();
}
main.qml
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
 
ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
    visible: true
    id: root
 
    Component.onCompleted: {
 
        Session.addThreads()
    }
 
    Rectangle {
        anchors.fill: parent
 
        TextArea {
            id: mainText
            anchors.fill: parent
            backgroundVisible: false
            readOnly: true
        }
 
//        Text {
//            id: mainText
//            anchors.fill: parent
//        }
 
        MouseArea {
            anchors.fill: parent
            onClicked: {
                //mainText.text =( Number(RandNum.getNumber()).toFixed(2) );
                RandNum.getNumber()
            }
        }
    }
 
    Connections {
        target: RandNum
 
        
        onWriteLog: {
            mainText.text = log
        }
    }
}
Я хочу что бы при клике на MouseArea вызывался слот в Randomnum::getNumber(), который бы мне отправлял сигнал writeLog(QString log) в qml с рандомным числом. Но так, как у меня разные потоки и я пытаюсь изменить гуй из дочернего потока, то естественно вылезает ошибка. Как это реализовать наиболее "красиво".
Как реализовать некрасиво я знаю. Как вариант сделать в session прокси слоты с сигналами, и уже их отправлять в qml. Так как это уже будет один поток, то работать будет, но появится много бесполезного кода.
И кстати, непонятно почему, но когда я TextArea заменяю на Text, то все работает в том виде, в котором сейчас это написано. Мб дело не в потоках вовсе?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2016, 18:06
Ответы с готовыми решениями:

Подсветка QML элементов QML-ного плагина в QtCreator в случае нахождения QML файлов плагина в ресурсах!
Здравствуйте! Если сделать плагин для QML и подключить его в основном проекте ну как - то так: import MiracleStudio.SkyControls 1.0 ...

QMl/QT при нажатии на кнопку должен окрыться другой qml файл
Додал anchors Вот что я сделал: import QtQuick 2.5 import QtQuick.Controls 1.4 ApplicationWindow { id: applicationWindow...

Как подключить QML-файл в C++ по моде, а также получить ссылки на QML-элементы в C++
Читал в интернете, как подключать QML-файлы. Кто-то использует QQmlView, кто-то QQmlApplicationEngine, а ещё приводят связку QQmlEngine и...

1
4 / 4 / 0
Регистрация: 13.10.2013
Сообщений: 183
05.01.2016, 13:42
Без относительно к QML когда я работал с потоками и мне нужно было чтобы значение какой либо переменной было видно в нескольких потоках я пользовался указателями. Просто передавал указатель во все потоки и не забывая про блокировки менял эту переменную по мере надобности в любом потоке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2016, 13:42
Помогаю со студенческими работами здесь

qml - что из себя представляет qml
Решил написать игру на Qt,выбор остановился на танчиках.Посмотрел примеры и понял что все игры ,что там даны написаны с помощью...

QML вызов другого qml
Всем привет. Название темы немного неверное. Вообщем проблема такая. Делаю игру на qml, и есть main_menu.qml, далее мне необходимо вызвать...

QML/C++
День добрый всем В связи с необходимостью работоспособности программы на различных платформах пришлось перебираться на QML Но есть ряд...

Qml tr
Здравствуйте. Скажите пожалуйста, как конструкцию &quot; property string header_text1: &quot;1 Chapter&quot; заменить на tr. как это...

C++ и qml
я должен на qml сделать UI,и к нему подключить логику на чистом c++(qt в логике не использовался) с чего начать??я должен заново...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru